MySQL實(shí)現(xiàn)雪花Id函數(shù)
環(huán)境 MySQL5.7
簡(jiǎn)介
snowflake是Twitter開源的分布式ID生成算法,結(jié)果是64bit的Long類型的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)依賴機(jī)器時(shí)鐘,如果機(jī)器上時(shí)鐘回?fù)?,有可能?huì)導(dǎo)致主鍵重復(fù)的問題。
雪花Id
腳本根據(jù) github:https://github.com/yitter/IdGenerator/tree/master/SQL 的SQL Server 版移植而來
雪花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è)名為TestSnowId存儲(chǔ)過程
內(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)文章
Jaspersoft?Studio添加mysql數(shù)據(jù)庫(kù)配置步驟
這篇文章主要為大家介紹了Jaspersoft?Studio添加mysql數(shù)據(jù)庫(kù)配置的步驟過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
MySQL遠(yuǎn)程連接丟失問題解決方法(Lost connection to MySQL server)
這篇文章主要介紹了MySQL遠(yuǎn)程連接丟失問題解決方法,Mysql錯(cuò)誤Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0解決方法,需要的朋友可以參考下2014-06-06
MySQL密碼忘記了5分鐘快速找回全攻略(附詳細(xì)圖解)
這篇文章主要介紹了MySQL密碼忘記了5分鐘快速找回的相關(guān)資料,適用于Windows和Mac系統(tǒng),通過跳過權(quán)限驗(yàn)證進(jìn)入無(wú)密碼模式,然后修改root密碼并恢復(fù)權(quán)限驗(yàn)證,需要的朋友可以參考下2026-01-01
MySQL實(shí)例精講單行函數(shù)以及字符數(shù)學(xué)日期流程控制
SQL函數(shù)即數(shù)據(jù)庫(kù)的內(nèi)置函數(shù),可以運(yùn)用在SQL語(yǔ)句中實(shí)現(xiàn)特定的功能。SQL單行函數(shù)對(duì)于每一行數(shù)據(jù)進(jìn)行計(jì)算后得到一行輸出結(jié)果。SQL單行函數(shù)根據(jù)數(shù)據(jù)類型分為字符函數(shù)、數(shù)字函數(shù)、日期函數(shù)、轉(zhuǎn)換函數(shù),另外還有一些別的函數(shù)2021-10-10
解決MySQL主從數(shù)據(jù)庫(kù)沒有同步的兩種方法
這篇文章主要介紹了解決MySQL主從數(shù)據(jù)庫(kù)沒有同步的兩種方法,需要的朋友可以參考下面文章內(nèi)容2021-09-09

