InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值
轉載自??InnoDB 的輔助索引葉子節點為什么不直接保存的記錄地址而要存主鍵鍵值
RT,最近看書關于innodb的
InnoDB是索引組織表,所以完整的數據記錄都存在聚集索引的葉子節點上
輔助索引的葉子節點保存的是對應的主鍵鍵值,而另外一種存儲引擎myisam葉子節點保存的是記錄的地址
我的問題是InnoDB 的輔助索引葉子節點為什么不直接保存的記錄地址而要存主鍵鍵值?(導致在使用輔助索引的查詢中要兩次訪問索引)
ps:想到的一個可能原因是 update 非索引列時,不需要更新輔助索引頁,不知道還有沒有其它原因?
(1)
本身innodb是以主鍵為主排序的表。。所以對于innodb來講,其在磁盤的排序已經由主鍵的順序定了,不能再按其它健排序。
其實輔助索引只要主鍵也有它的優點:一個磁盤塊能存儲更多的鍵值,使其在進行索引查找是,只需要讀取相對少量的磁盤塊就能掃描完全表,加之讀到主鍵,再查詢記錄是比較快的。
根本原因是INNODB是主鍵的索引組織表,其物理存儲已經由主鍵決定,不能再改變在磁盤中的存儲順序。
(2)
“一個磁盤塊能存儲更多的鍵值”
這個未必吧,還得取決于主鍵和地址的大小,地址一般由 文件號+塊號+塊內偏移組成,大概10個字節
不過也可以作為一個考慮因素,謝謝你的回復
(3)
個人也覺得是跟DML有關,當對一個innodb表進行大量DML后,B+樹會分裂,同一行記錄的頁地址會發生變化。
由于輔助索引記錄的是主鍵值,因此完全不用理會這個變化,如果輔助索引記錄的是實際頁地址,那DML一旦引起B+樹分裂,還得與輔助索引進行同步。
總結
以上是生活随笔為你收集整理的InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 东汉末年分三国是什么歌 东汉末年分三国歌
- 下一篇: 微信支付时间设置怎么没有了