MySQL的InnoDB引擎強烈建議使用自增主鍵的原因

一個X號的QB發表於2016-08-19


1)InnoDB使用聚集索引,資料記錄本身被存於主索引的葉子節點上,這就要求同一個葉子節點內的各條資料記錄按主鍵順序存放,因此每當一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子,則開闢一個新的頁(節點)如果表使用自增主鍵,那麼每次插入新的記錄時,記錄就會順序新增到當前索引節點後續位置,當一頁寫滿,就會自動開闢一個新的頁。這樣就就會形成一個緊湊的索引結構,近似順序填滿,由於每次插入時也不需要移動所有資料,因此效率很高,也不會增加很多額外的開銷維護索引如果使用非自增主鍵,由於每次插入主鍵的值近乎於隨機,因此每次新紀錄都要被插到現有索引頁的中間某個位置,此時MySQL不得不為了將新紀錄插到合適位置而移動資料,甚至目標頁面可能已經被寫到磁碟而從快取中清除,這增加了很多額外開銷,同時頻繁的移動,分頁造成了大量的碎片,得到不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建並優化填充頁面。

2)由於MySQL從磁碟讀取資料時一塊一塊來讀取的,同時,根據區域性性原理,MySQL引擎會選擇預讀一部分和你當前讀資料所在記憶體相鄰的資料塊,這個時候這些相鄰資料塊的資料已經存在於記憶體中。由於資料庫大部分是查詢操作,這個時候,如果主鍵是自增的話,資料儲存都是緊湊地儲存在一起的,那麼對於區域性性原理利用和避免過多地I/O操作都有著巨大的促進作用

相關文章