mysql 自增id
自增id 缺點 :
1 mysql insert 后 必須 SELECT LAST_INSERT_ID() 才能返回 id 。 對于業(yè)務(wù)方而言 , id 的生成以及返回邏輯 必須綁定mysql 。 id 自增這塊邏輯肯定要加鎖的 ,除此之外 ,主備切換 ,replace into 以及 其他的一些操作會導(dǎo)致id 生成連續(xù)性出現(xiàn)問題 。在同表高并發(fā)寫的情況下 , id 自增會存在性能瓶頸 。
優(yōu)化 : 將mysql id 生成 這一塊從mysql 功能 獨立出來 。能從本質(zhì)上解決上面的問題 。
2 通常我們根據(jù)業(yè)務(wù)維度(假如說根據(jù)地區(qū)) ,對數(shù)據(jù)庫進行數(shù)據(jù)分片 , 自增id 會出現(xiàn)相同的情況 。 這時候 對于業(yè)務(wù)來說 , 必須要 分片id + 自增id 才能定位 ,真實數(shù)據(jù),才具備唯一性 。
優(yōu)化: 全局唯一id
雪花id

image.png
1.第一位 占用1bit,其值始終是0,沒有實際作用。 2.時間戳 占用41bit,精確到毫秒,總共可以容納約69年的時間。 3.工作機器id 占用10bit,其中高位5bit是數(shù)據(jù)中心ID,低位5bit是工作節(jié)點ID,做多可以容納1024個節(jié)點。 4.序列號 占用12bit,每個節(jié)點每毫秒0開始不斷累加,最多可以累加到4095,一共可以產(chǎn)生4096個ID。
缺點
1在使用過程中 ,雪花id 工作機器id可能會出現(xiàn)問題 ,這個工作機器id 應(yīng)該是和你的應(yīng)用關(guān)聯(lián)在一起 。 開發(fā)同學 可能根本就注意到這點 ,你的工作機器id 沒有配置數(shù)據(jù)中心ID ,以及工作節(jié)點ID , 會根據(jù)mac 地址 , ip 地址去做一些計算 得到 工作機器id 。 問題就出在他這個算法上 ,會導(dǎo)致工作機器id重復(fù)。 可以參考mybatisplus github issue
https://github.com/baomidou/mybatis-plus/pull/2524
https://mp.weixin.qq.com/s/e-hEYALJXVKAP18WheJjRg
2 時鐘回撥也會導(dǎo)致出現(xiàn)相同時間戳的情況 , 比如服務(wù)器通過ntp同步時間