Mysql:自增主鍵VS非自增主鍵

使用自增主鍵的好處

每次插入新的記錄,記錄就會順序的添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一共新的頁。

使用非自增主鍵壞處

由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不爲了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

總結

如果InnoDB表的數據寫入順序能和B+樹索引的葉子節點順序一致的話,這時候存取效率是最高的。

  • 使用自增列(INT/BIGINT類型)做主鍵,這時候寫入順序是自增的,和B+數葉子節點分裂順序一致;
  • 該表不指定自增列做主鍵,同時也沒有可以被選爲主鍵的唯一索引(上面的條件),這時候InnoDB會選擇內置的ROWID作爲主鍵,寫入順序和ROWID增長順序一致;
  • 如果一個InnoDB表又沒有顯示主鍵,又有可以被選擇爲主鍵的唯一索引,但該唯一索引可能不是遞增關係時(例如字符串、UUID、多字段聯合唯一索引的情況),該表的存取效率就會比較差。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章