1.建議使用有序的自增ID作為主鍵
MySQL InnoDB 引擎底層數據結構是 B+ 樹,所謂的索引其實就是一顆 B+ 樹,一個表有多少個索引就會有多少顆 B+ 樹,mysql 中的數據都是按順序保存在 B+ 樹葉子節點上的(所以說索引本身是有序的)。
主要目的有三個:
- 提高范圍查詢效率;
- 增加排序效率;
- 提高掃表能力,順序訪問。
mysql 在底層又是以數據頁為單位來存儲數據的,一個數據頁大小默認為 16k,當然你也可以自定義大小,也就是說如果一個數據頁存滿了,mysql 就會去申請一個新的數據頁來存儲數據。
- 如果主鍵為自增 id 的話,mysql 在寫滿一個數據頁的時候,直接申請另一個新數據頁接着寫就可以了。
- 如果主鍵是非自增 id,為了確保索引有序,mysql 就需要將每次插入的數據都放到合適的位置上。
當往一個快滿或已滿的數據頁中插入數據時,新插入的數據會將數據頁寫滿,mysql 就需要申請新的數據頁,並且把上個數據頁中的部分數據挪到新的數據頁上。這就造成了頁分裂,這個大量移動數據的過程是會嚴重影響插入效率的。
2.在滿足業務需求的情況下,盡量使用占空間更小的主鍵
- 主鍵占用空間越大,每個頁存儲的主鍵個數越少,路樹就越少,B+樹的深度會邊長,導致IO次數會變多。
- 普通索引的葉子節點上保存的是主鍵 id 的值,如果主鍵 id 占空間較大的話,那將會成倍增加 mysql 空間占用大小。