MySQL實(shí)現(xiàn)雪花Id函數(shù)
環(huán)境 MySQL5.7
簡(jiǎn)介
snowflake是Twitter開(kāi)源的分布式ID生成算法,結(jié)果是64bit的Long類(lèi)型的ID,有著全局唯一和有序遞增的特點(diǎn)。
- 最高位是符號(hào)位,因?yàn)樯傻?ID 總是正數(shù),始終為0,不可用。
- 41位的時(shí)間序列,精確到毫秒級(jí),41位的長(zhǎng)度可以使用69年。時(shí)間位還有一個(gè)很重要的作用是可以根據(jù)時(shí)間進(jìn)行排序。
- 10位的機(jī)器標(biāo)識(shí),10位的長(zhǎng)度最多支持部署1024個(gè)節(jié)點(diǎn)。
- 12位的計(jì)數(shù)序列號(hào),序列號(hào)即一系列的自增ID,可以支持同一節(jié)點(diǎn)同一毫秒生成多個(gè)ID序號(hào),12位的計(jì)數(shù)序列號(hào)支持每個(gè)節(jié)點(diǎn)每毫秒產(chǎn)生4096個(gè)ID序號(hào)。
- 缺點(diǎn)也是有的,就是強(qiáng)依賴(lài)機(jī)器時(shí)鐘,如果機(jī)器上時(shí)鐘回?fù)?,有可能?huì)導(dǎo)致主鍵重復(fù)的問(wèn)題。
雪花Id
腳本根據(jù) github:https://github.com/yitter/IdGenerator/tree/master/SQL 的SQL Server 版移植而來(lái)
雪花Id腳本
CREATE FUNCTION `SnowId`() RETURNS bigint(20) BEGIN DECLARE b_current_time BIGINT; DECLARE b_time_tick BIGINT; DECLARE i_work_id INT; DECLARE i_work_id_big_length INT; DECLARE i_seq_big_length INT; DECLARE f_random FLOAT; DECLARE b_res BIGINT; SET i_work_id = 1; SET i_work_id_big_length = 4; SET i_seq_big_length = 8; SET b_current_time = (REPLACE(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)),'.','')) + 0; SET b_time_tick = b_current_time - 1582136402000; SET f_random = RAND(); SET b_res = b_time_tick * POWER(2, i_work_id_big_length + i_seq_big_length) + i_work_id * POWER(2, i_seq_big_length) + (5 + round((POWER(2, i_seq_big_length)-1) * f_random, 0)); RETURN b_res; END
測(cè)試腳本
創(chuàng)建一個(gè)名為T(mén)estSnowId存儲(chǔ)過(guò)程
內(nèi)容:
定義了一個(gè)int變量i默認(rèn)為1;
創(chuàng)建了一個(gè)臨時(shí)表temp_numbers用于存儲(chǔ)生成的SnowId;
循環(huán)5000次,并將SnowId添加到temp_numbers表內(nèi);
查詢temp_numbers表內(nèi)數(shù)據(jù);
刪除臨時(shí)表;
CREATE PROCEDURE `TestSnowId` () BEGIN DECLARE i INT DEFAULT 1; CREATE TEMPORARY TABLE IF NOT EXISTS temp_numbers ( number BIGINT ); WHILE i <= 5000 DO INSERT INTO temp_numbers ( number ) VALUES (SnowId ()); SET i = i + 1; END WHILE; SELECT * FROM temp_numbers; DROP TEMPORARY TABLE IF EXISTS temp_numbers; END
使用
調(diào)用語(yǔ)句
SELECT SnowId();
測(cè)試是否重復(fù)
CALL TestSnowId();
到此這篇關(guān)于MySQL實(shí)現(xiàn)雪花Id函數(shù)的文章就介紹到這了,更多相關(guān)MySQL 雪花Id內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql多條數(shù)據(jù)合并成一條的3種常見(jiàn)方法
在實(shí)際的應(yīng)用開(kāi)發(fā)中,有時(shí)我們需要將多條數(shù)據(jù)合并成一條數(shù)據(jù),以便更好地進(jìn)行數(shù)據(jù)分析和處理,本文就來(lái)介紹一下mysql多條數(shù)據(jù)合并成一條的方法,具有一定的參考價(jià)值2023-10-10Mysql動(dòng)態(tài)更新數(shù)據(jù)庫(kù)腳本的示例講解
今天小編就為大家分享一篇關(guān)于Mysql動(dòng)態(tài)更新數(shù)據(jù)庫(kù)腳本的示例講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Mysql數(shù)據(jù)庫(kù)主從同步的實(shí)現(xiàn)示例
本文主要介紹了Mysql數(shù)據(jù)庫(kù)主從同步的實(shí)現(xiàn)示例,包括配置文件設(shè)置、賬戶創(chuàng)建、同步命令及錯(cuò)誤處理,具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06MySQL無(wú)法存儲(chǔ)emoji表情解決方案分析
這篇文章主要介紹了MySQL無(wú)法存儲(chǔ)emoji表情解決方案,結(jié)合實(shí)例形式分析了Python爬蟲(chóng)爬取文章中emoji表情存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,涉及mysql utf8mb4編碼的修改相關(guān)操作技巧,需要的朋友可以參考下2018-07-07深入SQL Server中char、varchar、text和nchar、nvarchar、ntext的區(qū)別詳
本篇文章是對(duì)char、varchar、text和nchar、nvarchar、ntext的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06探討MySQL?保存日期用哪種數(shù)據(jù)類(lèi)型
在設(shè)計(jì)數(shù)據(jù)庫(kù)表時(shí)不可避免的需要用到時(shí)間類(lèi)型,到底選擇那種數(shù)據(jù)類(lèi)型來(lái)表示時(shí)間是一個(gè)值的討論的問(wèn)題,這篇文章主要介紹了MySQL保存日期用哪種數(shù)據(jù)類(lèi)型,需要的朋友可以參考下2023-08-08