Mysql ID生成策略的三種方法選擇及優(yōu)缺點
mysql ID生成策略一般常用的有三種:自增、UUID 以及雪花算法,下面就拿著三種展開分析一下。
自增主鍵(Auto Increment)
優(yōu)點:
簡單、易于使用和理解,保證唯一性,無需額外的查詢操作。
缺點:
不適用于分布式系統(tǒng),因為每個節(jié)點都需要維護一個獨立的計數(shù)器,可能會導致沖突和性能問題。
使用場景:
適用于單機或小規(guī)模應用,不需要分布式支持的場景。例如,傳統(tǒng)的單機應用、小型網(wǎng)站或內部管理系統(tǒng)。
UUID(Universally Unique Identifier)
優(yōu)點:
全局唯一性,分布式支持,獨立性。
缺點:
占用較多的存儲空間,無序性,可讀性較低。
使用場景:
適用于需要分布式支持、全局唯一性和獨立生成ID的場景,特別是在沒有數(shù)據(jù)庫連接的情況下。例如,分布式系統(tǒng)、大規(guī)模系統(tǒng)或需要獨立生成ID的場景。
雪花算法(Snowflake)
優(yōu)點:
支持分布式環(huán)境,生成的ID有序且唯一,包含時間戳信息。
缺點:
依賴于機器的唯一標識,不同機器之間的時間同步問題可能導致ID重復。
使用場景:
適用于需要分布式支持、有序和唯一的ID的場景。例如,大規(guī)模的分布式系統(tǒng)、微服務架構、分布式數(shù)據(jù)庫等。
雪花算法生成 ID 沖突問題:
1. 前提條件:
服務通過集群的方式部署,其中部分機器標識位一致。
業(yè)務存在一定的并發(fā)量,沒有并發(fā)量無法觸發(fā)重復問題。
生成 ID 的時機:同一毫秒下的序列號一致。
2. 標識位如何定義才能不重復?
有兩種方案:預分配和動態(tài)分配。
(1). 預分配(靜態(tài))
應用上線前,統(tǒng)計當前服務的節(jié)點數(shù),人工去申請標識位。
這種方案,沒有代碼開發(fā)量,在服務節(jié)點固定或者項目少可以使用,但是解決不了服務節(jié)點動態(tài)擴容性問題。
(2). 動態(tài)分配
將標識位存放在 Redis、Zookeeper、MySQL 等中間件,在服務啟動的時候去請求標識位,請求后標識位并將其更新為下一個可用的。
通過存放標識位,延伸出一個問題:雪花算法的 ID 是 服務內唯一還是全局唯一。
以 Redis 舉例,如果要做服務內唯一,存放標識位的 Redis 節(jié)點使用自己項目內的就可以;如果是全局唯一,所有使用雪花算法的應用,要用同一個 Redis 節(jié)點。
兩者的區(qū)別僅是 不同的服務間是否公用 Redis。如果沒有全局唯一的需求,最好使 ID 服務內唯一,因為這樣可以避免單點問題。
服務的節(jié)點數(shù)超過 1024,則需要做額外的擴展;可以擴展 10 bit 標識位,或者選擇開源分布式 ID 框架。
動態(tài)分配實現(xiàn)方案:Redis 存儲一個 Hash 結構 Key,包含兩個鍵值對:dataCenterId 和 workerId。
雪花算法不是萬能的,并不能適用于所有場景。如果 ID 要求全局唯一并且服務節(jié)點超出 1024 節(jié)點,可以選擇修改算法本身的組成,即擴展標識位,或者選擇開源方案:美團LEAF、百度UID。
總結
根據(jù)實際使用場景進行選擇:
單機或小規(guī)模應用:對于規(guī)模較小、不需要分布式支持的應用,ID自增是簡單而可行的選擇。它易于使用和理解,并能保證唯一性。
大規(guī)模分布式系統(tǒng):在需要分布式支持、有序和唯一ID的大規(guī)模系統(tǒng)中,雪花算法是更合適的選擇。它能夠生成分布式環(huán)境下的有序且唯一ID,適應大規(guī)模的分布式架構。
分布式環(huán)境下的全局唯一ID:如果全局唯一性是主要要求,并且不需要嚴格的有序性,UUID是一個可選的策略。它可以在分布式環(huán)境中生成全局唯一的ID,適用于分布式系統(tǒng)、大規(guī)模系統(tǒng)或需要獨立生成ID的場景。
需要注意的是,對于雪花算法和UUID,在分布式環(huán)境中需要注意時間同步問題。確保機器時間的同步性,以避免ID重復。
綜上所述,選擇適當?shù)腎D生成策略需要綜合考慮系統(tǒng)規(guī)模、分布式支持、唯一性和有序性要求以及時間同步問題。自增主鍵適用于規(guī)模較小、不需要分布式支持的簡單應用,而雪花算法則適用于需要分布式支持、有序和唯一ID的大規(guī)模應用。UUID 我們一般不做考慮,因為針對于分布式系統(tǒng)來說雪花算法比UUID方式性能更好,UUID占用存儲更大。
到此這篇關于Mysql ID生成策略的選擇及優(yōu)缺點的文章就介紹到這了,更多相關Mysql ID生成策略內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL數(shù)據(jù)庫數(shù)據(jù)刪除操作詳解
本文我們將要學習的是作為刪除數(shù)據(jù)使用的?“DELETE”?語句,“DELETE”?語句是用來刪除數(shù)據(jù)的,它不能用來刪除數(shù)據(jù)表本身。刪除數(shù)據(jù)表使用的是?“DROP”?語句,而?“DELETE”?的作用只是用來刪除記錄而已2022-08-08
為什么MySQL 刪除表數(shù)據(jù) 磁盤空間還一直被占用
這篇文章主要討論為什么MySQL 刪除表數(shù)據(jù) 磁盤空間還一直被占用,項目中使用Mysql作為數(shù)據(jù)庫,對于表來說,一般為表結構和表數(shù)據(jù)。表結構占用空間都是比較小的,一般都是表數(shù)據(jù)占用的空間。接下來小編就和大家一起進入下面文章內容的學習2021-10-10
MySQL中GROUP_CONCAT函數(shù)用法和核心細節(jié)(按日期分組拼接銷售產(chǎn)品經(jīng)典案例)
本文詳細介紹了MySQL的GROUP_CONCAT()函數(shù)的用法和核心細節(jié),包括函數(shù)定義、語法格式、常用修飾符(DISTINCT、ORDERBY、SEPARATOR)以及注意事項,感興趣的朋友跟隨小編一起看看吧2026-01-01

