最近看了一篇文章深入分析mysql為什么不推薦使用uuid或者雪花id作為主鍵
文章通過實驗分布測試自增主鍵、UUID主鍵、雪花算法生成主鍵測試總結,在隨着數據量到達百萬級以后,三種主鍵的插入效率:自增主鍵 > 雪花算法生成主鍵 > UUID主鍵;
究其原因:
- 自增主鍵按順序插入,頁面按順序填充,不浪費空間;減少頁分裂、碎片的產生;MySQL 行記錄的定位和尋址很快;
- UUID主鍵插入,無順序,數據分布離散;隨機IO尋址和頁定位;頁分裂;數據碎片;
- 雪花算法,自增有序,適合分布式環境,數據量大時,效率更高;
該算法生成19位的long型有序數字,MySQL中用bigint來存儲(bigint長度為20位),
導致主鍵索引空間會很大,這樣二級索引占用空間也會很大(InnoDB引擎),MySQL有限的緩沖區,存儲的索引與數據會減少,磁盤IO的概率也會增加。
最佳實踐:使用InnoDB引擎下應該盡可能的按主鍵的自增順序插入,並且盡可能使用單調的增加的聚簇鍵的值來插入新行,此主鍵與業務無關,只是用來做主鍵。
避免主鍵被人利用,再新增業務主鍵,比如訂單號、身份證號、手機號等...
是否需要考慮在高並發下InnoDB在按主鍵進行插入的時候會造成明顯的鎖爭用,主鍵的上界會成為爭搶的熱點,因為所有的插入都發生在這里,並發插入會導致間隙鎖競爭,待研究。。。
參考:
數據庫,主鍵為何不宜太長長長長長長長長?