Sql-Server

預設情況下,所有關係 DBMS 是否都將表元組儲存在基於主鍵的聚集索引中?

  • December 14, 2018

所以我正在閱讀 MySQL innoDB,它顯然預設將表數據儲存在基於主鍵的聚集索引(b+tree)上,元組位於該 b+tree 的葉子中

https://blog.jcole.us/2013/01/10/btree-index-structures-in-innodb/

我想知道所有著名的關係型數據庫管理系統,如PostgreSQL、Oracle、SQL 伺服器、SQLite是否都以相同的方式儲存它?通過基於主鍵創建聚集索引(b+tree)並將數據儲存在樹的葉子上?

並且數據庫中主鍵的聚集索引基本上意味著將基於主鍵的表儲存在B +樹表上嗎?

(對不起,如果這是一個一般性問題,但我不能對我提到的每個數據庫提出 4-5 個單獨的問題,如果您只知道其中一個或幾個,請告訴)

另外,如果它的數據庫預設情況下不使用集群,您能否解釋一下它是如何構造文件的,例如它們是否在主鍵上創建了一個 b+tree,其葉子指向堆內的某種地址或… ?

編輯 :

到目前為止,我們得到了除 SQLite 之外的所有問題的答案,如果有人知道預設情況下表是如何實際儲存在 SQLite 中的,請告知。

PostgreSQL、Oracle、SQL server、SQLite 等所有著名的關係型 DBMS 是否都以相同的方式儲存它?通過基於主鍵創建聚集索引(b+tree)並將數據儲存在樹的葉子上?

不,不是全部。讓我們一一來看:

  • MySQL。MySQL 有幾個“引擎”,根據定義表使用的引擎,儲存是:

    • InnoDB的,您所描述的,表數據儲存在聚集索引中,索引基於表上的主鍵列(如果沒有定義 PK,則在第一個 UNIQUE 索引上非空列,並且在缺少該列的情況下,在一個秘密的 6 字節內部列上)。
    • MyISAM,表是堆,而不是聚集索引。
    • 其他引擎:(NBD、Blackhole、CSV 等),我認為它們都沒有使用聚集索引(可能 NBD 除外,不確定)
    • TokuDB的。與 InnoDB 類似,但您可以定義多個聚集索引!
  • SQL Server:的,具有 PK 的表的預設行為是聚集在 PK 上。這可以通過聲明 PK 是NONCLUSTERED. 您還可以定義另一個索引(不是 PK)作為表的聚集索引。如果 PK 被定義為NONCLUSTERED並且沒有一個索引被定義為CLUSTERED,那麼這個表就是一個堆。在最近的版本中,添加了第三個選項(除了聚集索引和堆):列儲存,這是一種組織表數據的不同方式。

  • PostgreSQL沒有。所有的表都是堆,期間。您可以創建各種類型的附加索引(btree、hash、gin、gist、brin 等),但表數據儲存在堆中。

  • 甲骨文沒有。預設情況下,這些表是堆,除非創建為索引組織表(Oracle 的聚集索引術語)。


關於表數據組織的其他說明:

  • 聚集索引:有一個 btee+ 索引 - 基於某些列 - 葉子包含表的數據。
  • Heap:堆沒有 btree 索引(其他索引如 PK 可能仍使用 btree)。數據儲存為無序列表的記錄。插入新行時,通常會添加到具有可用空間的磁碟頁面中。行被一些特殊的引用Page/RowID(細節是依賴於實現的,並且從 DBMS 到 DBMS 肯定不同),所以其他索引將包括這個引用。
  • Columnstore:數據儲存為列而不是行的結構類型。

可以在每個 DBMS 的文件和以下位置找到更多詳細資訊: - Wikipedia: Database Storage Structures

引用自:https://dba.stackexchange.com/questions/224964