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