MySQL的InnoDB存儲引擎為什么要用自增的主鍵?


主鍵是一種唯一索引,InnoDB存儲引擎是B+Tree優化后實現的,自增主鍵是為了維持B+Tree的特性且不用頻繁的分裂調整。

 

在InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。

這種索引叫做聚集索引。因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整形。

InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。所以不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。

InnoDB數據文件本身是一顆B+Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持B+Tree的特性而頻繁的分裂調整,十分低效。

 

1、B-Tree

B-Tree,首先定義一條數據記錄為一個二元組[key, data],key為記錄的鍵值,對於不同數據記錄,key是互不相同的;data為數據記錄除key外的數據。

結構如下:

 

  2、B+Tree

由B-Tree變種而來,區別:內節點不存儲data,只存儲key;葉子節點不存儲指針。由於B+Tree內節點去掉了data域,因此可以擁有更大的出度,擁有更好的性能。

 

 

3、InnoDB存儲引擎,在經典B+Tree的基礎上進行了優化,增加了順序訪問指針。在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指針,就形成了帶有順序訪問指針的B+Tree。這樣就提高了區間訪問性能。

 

 

參考:
mysql B+Tree索引   https://www.cnblogs.com/coshaho/p/7203186.html
MySQL索引實現      https://www.cnblogs.com/coshaho/p/7203214.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM