在多用戶、高併發的互聯網應用場景中,mysql數據庫表的主鍵(pk)怎麼設計更合理呢?可能的選擇:
UUID
UUID的生成和使用,請參閱:https://baike.baidu.com/item/UUID/5921266?fr=aladdin
優點:
- 好生成,容易保證唯一性(尤其全庫唯一性的應用場景)
- 有利於多用戶、高併發的寫操作性能提升
- 父子表事務insert數據時,子表容易得到parent_id,不需要額外的查詢等獲取方式,甚至該操作可以放到事務外部
缺點:
- 不利於閱讀和記憶
- 比int佔更多的空間,包括數據存儲空間、索引空間
- 沒有大小比較、順序的實際意義,innodb存儲中,頁中數據爲隨機存儲,讀取也爲隨機讀,較少能順序讀,對讀取性能有影響(隨機讀;拿一批數據時,可能需要讀取更多的頁數據)
自增id
優點:
- 好閱讀、好記憶
- 佔用空間少
- Innerdb存儲引擎中,該表數據會按照自增id大小順序,依次存儲,有利於讀操作的性能提升(更多的順序讀,裝載更少的頁)
缺點:
- 父子表事務insert數據時,子表得到父表的parent_id,麻煩一些,有些語言和框架可能還需要額外進行查詢,甚至有併發髒數據風險