Mysql ID生成策略的三種方法選擇及優(yōu)缺點(diǎn)
mysql ID生成策略一般常用的有三種:自增、UUID 以及雪花算法,下面就拿著三種展開分析一下。
自增主鍵(Auto Increment)
優(yōu)點(diǎn):
簡單、易于使用和理解,保證唯一性,無需額外的查詢操作。
缺點(diǎn):
不適用于分布式系統(tǒng),因?yàn)槊總€(gè)節(jié)點(diǎn)都需要維護(hù)一個(gè)獨(dú)立的計(jì)數(shù)器,可能會(huì)導(dǎo)致沖突和性能問題。
使用場(chǎng)景:
適用于單機(jī)或小規(guī)模應(yīng)用,不需要分布式支持的場(chǎng)景。例如,傳統(tǒng)的單機(jī)應(yīng)用、小型網(wǎng)站或內(nèi)部管理系統(tǒng)。
UUID(Universally Unique Identifier)
優(yōu)點(diǎn):
全局唯一性,分布式支持,獨(dú)立性。
缺點(diǎn):
占用較多的存儲(chǔ)空間,無序性,可讀性較低。
使用場(chǎng)景:
適用于需要分布式支持、全局唯一性和獨(dú)立生成ID的場(chǎng)景,特別是在沒有數(shù)據(jù)庫連接的情況下。例如,分布式系統(tǒng)、大規(guī)模系統(tǒng)或需要獨(dú)立生成ID的場(chǎng)景。
雪花算法(Snowflake)
優(yōu)點(diǎn):
支持分布式環(huán)境,生成的ID有序且唯一,包含時(shí)間戳信息。
缺點(diǎn):
依賴于機(jī)器的唯一標(biāo)識(shí),不同機(jī)器之間的時(shí)間同步問題可能導(dǎo)致ID重復(fù)。
使用場(chǎng)景:
適用于需要分布式支持、有序和唯一的ID的場(chǎng)景。例如,大規(guī)模的分布式系統(tǒng)、微服務(wù)架構(gòu)、分布式數(shù)據(jù)庫等。
雪花算法生成 ID 沖突問題:
1. 前提條件:
服務(wù)通過集群的方式部署,其中部分機(jī)器標(biāo)識(shí)位一致。
業(yè)務(wù)存在一定的并發(fā)量,沒有并發(fā)量無法觸發(fā)重復(fù)問題。
生成 ID 的時(shí)機(jī):同一毫秒下的序列號(hào)一致。
2. 標(biāo)識(shí)位如何定義才能不重復(fù)?
有兩種方案:預(yù)分配和動(dòng)態(tài)分配。
(1). 預(yù)分配(靜態(tài))
應(yīng)用上線前,統(tǒng)計(jì)當(dāng)前服務(wù)的節(jié)點(diǎn)數(shù),人工去申請(qǐng)標(biāo)識(shí)位。
這種方案,沒有代碼開發(fā)量,在服務(wù)節(jié)點(diǎn)固定或者項(xiàng)目少可以使用,但是解決不了服務(wù)節(jié)點(diǎn)動(dòng)態(tài)擴(kuò)容性問題。
(2). 動(dòng)態(tài)分配
將標(biāo)識(shí)位存放在 Redis、Zookeeper、MySQL 等中間件,在服務(wù)啟動(dòng)的時(shí)候去請(qǐng)求標(biāo)識(shí)位,請(qǐng)求后標(biāo)識(shí)位并將其更新為下一個(gè)可用的。
通過存放標(biāo)識(shí)位,延伸出一個(gè)問題:雪花算法的 ID 是 服務(wù)內(nèi)唯一還是全局唯一。
以 Redis 舉例,如果要做服務(wù)內(nèi)唯一,存放標(biāo)識(shí)位的 Redis 節(jié)點(diǎn)使用自己項(xiàng)目內(nèi)的就可以;如果是全局唯一,所有使用雪花算法的應(yīng)用,要用同一個(gè) Redis 節(jié)點(diǎn)。
兩者的區(qū)別僅是 不同的服務(wù)間是否公用 Redis。如果沒有全局唯一的需求,最好使 ID 服務(wù)內(nèi)唯一,因?yàn)檫@樣可以避免單點(diǎn)問題。
服務(wù)的節(jié)點(diǎn)數(shù)超過 1024,則需要做額外的擴(kuò)展;可以擴(kuò)展 10 bit 標(biāo)識(shí)位,或者選擇開源分布式 ID 框架。
動(dòng)態(tài)分配實(shí)現(xiàn)方案:Redis 存儲(chǔ)一個(gè) Hash 結(jié)構(gòu) Key,包含兩個(gè)鍵值對(duì):dataCenterId 和 workerId。
雪花算法不是萬能的,并不能適用于所有場(chǎng)景。如果 ID 要求全局唯一并且服務(wù)節(jié)點(diǎn)超出 1024 節(jié)點(diǎn),可以選擇修改算法本身的組成,即擴(kuò)展標(biāo)識(shí)位,或者選擇開源方案:美團(tuán)LEAF、百度UID。
總結(jié)
根據(jù)實(shí)際使用場(chǎng)景進(jìn)行選擇:
單機(jī)或小規(guī)模應(yīng)用:對(duì)于規(guī)模較小、不需要分布式支持的應(yīng)用,ID自增是簡單而可行的選擇。它易于使用和理解,并能保證唯一性。
大規(guī)模分布式系統(tǒng):在需要分布式支持、有序和唯一ID的大規(guī)模系統(tǒng)中,雪花算法是更合適的選擇。它能夠生成分布式環(huán)境下的有序且唯一ID,適應(yīng)大規(guī)模的分布式架構(gòu)。
分布式環(huán)境下的全局唯一ID:如果全局唯一性是主要要求,并且不需要嚴(yán)格的有序性,UUID是一個(gè)可選的策略。它可以在分布式環(huán)境中生成全局唯一的ID,適用于分布式系統(tǒng)、大規(guī)模系統(tǒng)或需要獨(dú)立生成ID的場(chǎng)景。
需要注意的是,對(duì)于雪花算法和UUID,在分布式環(huán)境中需要注意時(shí)間同步問題。確保機(jī)器時(shí)間的同步性,以避免ID重復(fù)。
綜上所述,選擇適當(dāng)?shù)腎D生成策略需要綜合考慮系統(tǒng)規(guī)模、分布式支持、唯一性和有序性要求以及時(shí)間同步問題。自增主鍵適用于規(guī)模較小、不需要分布式支持的簡單應(yīng)用,而雪花算法則適用于需要分布式支持、有序和唯一ID的大規(guī)模應(yīng)用。UUID 我們一般不做考慮,因?yàn)獒槍?duì)于分布式系統(tǒng)來說雪花算法比UUID方式性能更好,UUID占用存儲(chǔ)更大。
到此這篇關(guān)于Mysql ID生成策略的選擇及優(yōu)缺點(diǎn)的文章就介紹到這了,更多相關(guān)Mysql ID生成策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL忘記root密碼錯(cuò)誤號(hào)碼1045的解決辦法
這篇文章主要介紹了MySQL忘記root密碼錯(cuò)誤號(hào)碼1045的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08使用JDBC從數(shù)據(jù)庫中查詢數(shù)據(jù)的方法
下面小編就為大家?guī)硪黄褂肑DBC從數(shù)據(jù)庫中查詢數(shù)據(jù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08mysql?8.0.27?安裝配置方法圖文教程(Windows64位)
這篇文章主要為大家詳細(xì)介紹了mysql?8.0.27?下載、安裝與配置圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04如何利用SSH隧道連接遠(yuǎn)程MySQL數(shù)據(jù)庫
為保護(hù)MySQL數(shù)據(jù)庫安全,可通過SSH隧道連接,服務(wù)端僅需開放SSH端口,加強(qiáng)密碼策略,客戶端可使用Navicat等工具,或通過編程(如SpringBoot)實(shí)現(xiàn)端口轉(zhuǎn)發(fā),推薦使用密鑰建立SSH隧道,以免密碼泄露風(fēng)險(xiǎn),詳述了端口轉(zhuǎn)發(fā)的手動(dòng)設(shè)置方法及自動(dòng)化腳本配置2024-11-11MySql數(shù)據(jù)分區(qū)操作之新增分區(qū)操作
這篇文章主要介紹了MySql數(shù)據(jù)分區(qū)操作之新增分區(qū)操作,本文講解了測(cè)試創(chuàng)建分區(qū)表文件、插入測(cè)試數(shù)據(jù)、查詢P2中的數(shù)據(jù)等內(nèi)容,需要的朋友可以參考下2015-03-03