使用自增主鍵的好處
每次插入新的記錄,記錄就會順序的添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一共新的頁。
使用非自增主鍵壞處
由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不爲了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。
總結
如果InnoDB表的數據寫入順序能和B+樹索引的葉子節點順序一致的話,這時候存取效率是最高的。
- 使用自增列(INT/BIGINT類型)做主鍵,這時候寫入順序是自增的,和B+數葉子節點分裂順序一致;
- 該表不指定自增列做主鍵,同時也沒有可以被選爲主鍵的唯一索引(上面的條件),這時候InnoDB會選擇內置的ROWID作爲主鍵,寫入順序和ROWID增長順序一致;
- 如果一個InnoDB表又沒有顯示主鍵,又有可以被選擇爲主鍵的唯一索引,但該唯一索引可能不是遞增關係時(例如字符串、UUID、多字段聯合唯一索引的情況),該表的存取效率就會比較差。