我知道在聚集索引的葉節點中,表記錄與主鍵一起存盤。
但是我發現有些文章說主鍵是用真實記錄的塊地址而不是真實表記錄存盤的。
你能告訴我哪個是正確的嗎?
(1)存盤塊地址

(2)存盤真實資料

uj5u.com熱心網友回復:
小心你閱讀的內容。確保文章談論“MySQL”及其主要“引擎”“InnoDB”。
主鍵存盤的是真實記錄的塊地址,而不是真實的表記錄。
資料的 B Tree 的每個葉節點(塊)中存盤了幾個整行。該 BTree 由 排序PRIMARY KEY,它(顯然)是行的一部分。
唯一的“塊地址”是兩個圖中的鏈接。
我投票給你的第 2 個圖表,但有以下條件:
- 有一個 id=6 的 4 列行和 James, 37, LA 的其他列。
- id=15 的行沒有完全顯示。也就是說,您遺漏了其他 3 列。
一個“塊”是 16KB,可以容納 1 到幾百行,具體取決于
- 行的大小,
- 行是否已被洗掉,留下“空閑”空間,
- 等等。
(對于資料或索引,每個塊 100 行是一個簡單的經驗法則。)
uj5u.com熱心網友回復:
在mysql和innodb的背景關系中,來自mysql官方頁面 https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html
每個 InnoDB 表都有一個稱為聚集索引的特殊索引,用于存盤行資料。
如果表很大,與使用與索引記錄不同的頁面存盤行資料的存盤組織相比,聚簇索引體系結構通常可以節省磁盤 I/O 操作。
基于以上事實,尤其是第 2 條,我相信 #2 是正確的。在我看來,原因是 (1) 節省一次 I/O。如果葉子節點保存了頁地址,就會再有一次 I/O 來獲取記錄。
(2)更多的可維護性。如果發生分頁,葉子節點只保存頁地址,聚簇索引更新記錄資料頁地址會很麻煩。
但是,我認為#1 有分的原因是,僅保存地址比保存整行記錄資料從而存盤更多索引便宜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/367607.html
