環(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)依賴機(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();
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-745333.html
測(cè)試是否重復(fù)
CALL TestSnowId();
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-745333.html
到了這里,關(guān)于MySQL 雪花Id函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!