研發(fā)強烈反對用自增id,堅持用uuid做主鍵,該怎么辦?
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
最近,公司剛剛開了一個新項目,研發(fā)丟過來的建表語句,一看全都是uuid做主鍵。。。 頭大,想要研發(fā)改成自增id,結果研發(fā)來一句,自增id不利于數(shù)據(jù)安全。 對于一個對數(shù)據(jù)安全要求高的公司來說,這一句秒殺了。 但是,此題還得解。 本期就說說自增id和uuid的優(yōu)劣,以及最后的解決方案。 核心要點 1. 為什么用自增ID 2. 自增ID的優(yōu)缺點 3. UUID的優(yōu)缺點 4. 解決方案 5. 總結 為什么用自增ID 為什么DBA總是強調(diào)要用自增id做主鍵? 這也是研發(fā)同學一直以來的疑問,一般DBA會說基于性能考慮。具體為什么,可能也沒詳細解釋過。今天,簡單明了地解釋一下。 MySQL數(shù)據(jù)如何存儲: clustered index The In the Oracle Database product, this type of table is known as an index-organized table. 首先, 官方手冊中關于聚集索引有詳細的說明 InnoDB表存儲基于主鍵列的值進行組織 這類表又稱之為索引組織表 總結一句話就是:MySQL的innodb表的數(shù)據(jù)是按照主鍵的順序進行存儲的。 其次, MySQL數(shù)據(jù)庫在磁盤上按數(shù)據(jù)頁進行存儲的,每個數(shù)據(jù)頁的默認大小為16k 有序主鍵和無序主鍵的區(qū)別: 1. 有序主鍵(例如自增ID)存儲性能:
查詢性能:
2. 無序主鍵(例如UUID)存儲性能:
查詢性能:
自增ID的優(yōu)缺點 優(yōu)點:
缺點:
UUID的優(yōu)缺點 優(yōu)點: 全局唯一性:UUID能夠在分布式系統(tǒng)中保證唯一性,而無需依賴中心化的ID生成服務。 支持分布式環(huán)境:在分布式架構中,UUID特別適合用于跨數(shù)據(jù)庫實例的記錄合并,不會引起主鍵沖突。 數(shù)據(jù)遷移靈活性:數(shù)據(jù)遷移、跨系統(tǒng)整合等操作更簡單,不需要重新生成主鍵或做ID映射。 避免信息泄露:UUID的隨機性避免了可能會暴露插入的順序或數(shù)量這一風險,增強了數(shù)據(jù)的安全性。 插入性能低:UUID是無序的隨機字符串,在B+樹等結構中不能按順序插入,導致頻繁的頁分裂,增加了數(shù)據(jù)庫索引的維護開銷,影響插入性能。 占用存儲空間大:UUID通常為128位的字符串,存儲時比自增整數(shù)(4字節(jié)或8字節(jié))更占用空間。 查詢性能差:因為UUID是無序的,基于UUID的范圍查詢性能低。UUID在數(shù)據(jù)頁中分布分散,導致更多的磁盤隨機讀取,而不是連續(xù)讀取,增加了IO負擔。 排序和對比成本高:UUID長度較長,進行排序和比較的成本也較高,尤其在需要頻繁排序的場景中,性能開銷更大。 閱讀性差:UUID是隨機生成的長字符串,可讀性差,不易辨識和調(diào)試,增加了手動操作或日志分析的難度。 解決方案 了解了兩種方案的優(yōu)缺點,接下來就是要取舍了,如何平衡各方?
最后決定采用 UUID v7 UUIDv7特點:
以目前公司新項目為例,之前采用java的hutool工具生成uuid,同樣支持uuidv7。只需要更換一個調(diào)用方法即可,代碼修改量極小。 總結
該文章在 2024/11/4 10:34:50 編輯過 |
相關文章
正在查詢... |