Mysql ID生成策略的三種方法選擇及優(yōu)缺點(diǎn)
mysql ID生成策略一般常用的有三種:自增、UUID 以及雪花算法,下面就拿著三種展開(kāi)分析一下。
自增主鍵(Auto Increment)
優(yōu)點(diǎn):
簡(jiǎn)單、易于使用和理解,保證唯一性,無(wú)需額外的查詢操作。
缺點(diǎn):
不適用于分布式系統(tǒng),因?yàn)槊總€(gè)節(jié)點(diǎn)都需要維護(hù)一個(gè)獨(dú)立的計(jì)數(shù)器,可能會(huì)導(dǎo)致沖突和性能問(wèn)題。
使用場(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ǔ)空間,無(wú)序性,可讀性較低。
使用場(chǎng)景:
適用于需要分布式支持、全局唯一性和獨(dú)立生成ID的場(chǎng)景,特別是在沒(méi)有數(shù)據(jù)庫(kù)連接的情況下。例如,分布式系統(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í)間同步問(wèn)題可能導(dǎo)致ID重復(fù)。
使用場(chǎng)景:
適用于需要分布式支持、有序和唯一的ID的場(chǎng)景。例如,大規(guī)模的分布式系統(tǒng)、微服務(wù)架構(gòu)、分布式數(shù)據(jù)庫(kù)等。
雪花算法生成 ID 沖突問(wèn)題:
1. 前提條件:
服務(wù)通過(guò)集群的方式部署,其中部分機(jī)器標(biāo)識(shí)位一致。
業(yè)務(wù)存在一定的并發(fā)量,沒(méi)有并發(fā)量無(wú)法觸發(fā)重復(fù)問(wèn)題。
生成 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í)位。
這種方案,沒(méi)有代碼開(kāi)發(fā)量,在服務(wù)節(jié)點(diǎn)固定或者項(xiàng)目少可以使用,但是解決不了服務(wù)節(jié)點(diǎn)動(dòng)態(tài)擴(kuò)容性問(wèn)題。
(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è)可用的。
通過(guò)存放標(biāo)識(shí)位,延伸出一個(gè)問(wèn)題:雪花算法的 ID 是 服務(wù)內(nèi)唯一還是全局唯一。
以 Redis 舉例,如果要做服務(wù)內(nèi)唯一,存放標(biāo)識(shí)位的 Redis 節(jié)點(diǎn)使用自己項(xiàng)目?jī)?nèi)的就可以;如果是全局唯一,所有使用雪花算法的應(yīng)用,要用同一個(gè) Redis 節(jié)點(diǎn)。
兩者的區(qū)別僅是 不同的服務(wù)間是否公用 Redis。如果沒(méi)有全局唯一的需求,最好使 ID 服務(wù)內(nèi)唯一,因?yàn)檫@樣可以避免單點(diǎn)問(wèn)題。
服務(wù)的節(jié)點(diǎn)數(shù)超過(guò) 1024,則需要做額外的擴(kuò)展;可以擴(kuò)展 10 bit 標(biāo)識(shí)位,或者選擇開(kāi)源分布式 ID 框架。
動(dòng)態(tài)分配實(shí)現(xiàn)方案:Redis 存儲(chǔ)一個(gè) Hash 結(jié)構(gòu) Key,包含兩個(gè)鍵值對(duì):dataCenterId 和 workerId。
雪花算法不是萬(wàn)能的,并不能適用于所有場(chǎng)景。如果 ID 要求全局唯一并且服務(wù)節(jié)點(diǎn)超出 1024 節(jié)點(diǎn),可以選擇修改算法本身的組成,即擴(kuò)展標(biāo)識(shí)位,或者選擇開(kāi)源方案:美團(tuán)LEAF、百度UID。
總結(jié)
根據(jù)實(shí)際使用場(chǎng)景進(jìn)行選擇:
單機(jī)或小規(guī)模應(yīng)用:對(duì)于規(guī)模較小、不需要分布式支持的應(yīng)用,ID自增是簡(jiǎn)單而可行的選擇。它易于使用和理解,并能保證唯一性。
大規(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í)間同步問(wèn)題。確保機(jī)器時(shí)間的同步性,以避免ID重復(fù)。
綜上所述,選擇適當(dāng)?shù)腎D生成策略需要綜合考慮系統(tǒng)規(guī)模、分布式支持、唯一性和有序性要求以及時(shí)間同步問(wèn)題。自增主鍵適用于規(guī)模較小、不需要分布式支持的簡(jiǎn)單應(yīng)用,而雪花算法則適用于需要分布式支持、有序和唯一ID的大規(guī)模應(yīng)用。UUID 我們一般不做考慮,因?yàn)獒槍?duì)于分布式系統(tǒng)來(lái)說(shuō)雪花算法比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數(shù)據(jù)庫(kù)數(shù)據(jù)刪除操作詳解
本文我們將要學(xué)習(xí)的是作為刪除數(shù)據(jù)使用的?“DELETE”?語(yǔ)句,“DELETE”?語(yǔ)句是用來(lái)刪除數(shù)據(jù)的,它不能用來(lái)刪除數(shù)據(jù)表本身。刪除數(shù)據(jù)表使用的是?“DROP”?語(yǔ)句,而?“DELETE”?的作用只是用來(lái)刪除記錄而已2022-08-08
為什么MySQL 刪除表數(shù)據(jù) 磁盤(pán)空間還一直被占用
這篇文章主要討論為什么MySQL 刪除表數(shù)據(jù) 磁盤(pán)空間還一直被占用,項(xiàng)目中使用Mysql作為數(shù)據(jù)庫(kù),對(duì)于表來(lái)說(shuō),一般為表結(jié)構(gòu)和表數(shù)據(jù)。表結(jié)構(gòu)占用空間都是比較小的,一般都是表數(shù)據(jù)占用的空間。接下來(lái)小編就和大家一起進(jìn)入下面文章內(nèi)容的學(xué)習(xí)2021-10-10
MySQL中GROUP_CONCAT函數(shù)用法和核心細(xì)節(jié)(按日期分組拼接銷售產(chǎn)品經(jīng)典案例)
本文詳細(xì)介紹了MySQL的GROUP_CONCAT()函數(shù)的用法和核心細(xì)節(jié),包括函數(shù)定義、語(yǔ)法格式、常用修飾符(DISTINCT、ORDERBY、SEPARATOR)以及注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧2026-01-01
MySQL中定位DDL被阻塞的問(wèn)題處理過(guò)程
本文介紹了如何判斷MySQL DDL是否被阻塞,以及如何定位和解決DDL阻塞問(wèn)題,通過(guò)分析`sys.schema_table_lock_waits`表和`information_schema.innodb_trx`表,可以定位阻塞DDL的會(huì)話,并采取相應(yīng)的解決措施2026-03-03

