欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL實(shí)現(xiàn)雪花Id函數(shù)

 更新時(shí)間:2023年11月01日 11:11:10   作者:JiaMu?Sun  
相比UUID無(wú)序生成的id而言,雪花算法是有序的,而且都是由數(shù)字組成,本文主要介紹了MySQL實(shí)現(xiàn)雪花Id函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下

環(huán)境 MySQL5.7

簡(jiǎn)介

snowflake是Twitter開(kāi)源的分布式ID生成算法,結(jié)果是64bit的Long類型的ID,有著全局唯一和有序遞增的特點(diǎn)。

show

  • 最高位是符號(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();

getSnowId

測(cè)試是否重復(fù)

CALL TestSnowId();

test

到此這篇關(guān)于MySQL實(shí)現(xiàn)雪花Id函數(shù)的文章就介紹到這了,更多相關(guān)MySQL 雪花Id內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • mysql中字段類型轉(zhuǎn)義方式

    mysql中字段類型轉(zhuǎn)義方式

    這篇文章主要介紹了mysql中字段類型轉(zhuǎn)義方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Mysql8.0遞歸查詢的簡(jiǎn)單用法示例

    Mysql8.0遞歸查詢的簡(jiǎn)單用法示例

    在項(xiàng)目中會(huì)遇到同一個(gè)表中保存著父子關(guān)系的數(shù)據(jù),最常見(jiàn)的就是處理樹(shù)形結(jié)構(gòu)資源,這篇文章主要給大家介紹了關(guān)于Mysql8.0遞歸查詢的簡(jiǎn)單用法,需要的朋友可以參考下
    2021-08-08
  • SQL優(yōu)化教程之in與range查詢

    SQL優(yōu)化教程之in與range查詢

    這篇文章主要介紹了給大家介紹了SQL優(yōu)化之in與range查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • MSQL中DATETIME或TIMESTAMP的區(qū)別小結(jié)

    MSQL中DATETIME或TIMESTAMP的區(qū)別小結(jié)

    MySQL中的?DATETIME?和?TIMESTAMP?類型都用于存儲(chǔ)日期和時(shí)間信息,本文主要介紹了MSQL中DATETIME或TIMESTAMP的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • mysql報(bào)錯(cuò):MySQL server version for the right syntax to use near type=InnoDB的解決方法

    mysql報(bào)錯(cuò):MySQL server version for the right syntax to use nea

    這篇文章主要介紹了mysql報(bào)錯(cuò):MySQL server version for the right syntax to use near type=InnoDB的解決方法,涉及MySQL語(yǔ)句的使用技巧,需要的朋友可以參考下
    2016-01-01
  • mysql alter table命令修改表結(jié)構(gòu)實(shí)例

    mysql alter table命令修改表結(jié)構(gòu)實(shí)例

    這篇文章主要介紹了mysql alter table命令修改表結(jié)構(gòu)實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 淺談mysql使用limit分頁(yè)優(yōu)化方案的實(shí)現(xiàn)

    淺談mysql使用limit分頁(yè)優(yōu)化方案的實(shí)現(xiàn)

    在mysql中l(wèi)imit可以實(shí)現(xiàn)快速分頁(yè),但是如果數(shù)據(jù)到了幾百萬(wàn)時(shí)我們的limit必須優(yōu)化才能有效的合理的實(shí)現(xiàn)分頁(yè)了,否則可能卡死你的服務(wù)器哦。感興趣的可以一起來(lái)了解一下如何實(shí)現(xiàn)優(yōu)化
    2018-12-12
  • MySQL聯(lián)合查詢實(shí)現(xiàn)方法詳解

    MySQL聯(lián)合查詢實(shí)現(xiàn)方法詳解

    聯(lián)合查詢union將多次查詢(多條select語(yǔ)句)的結(jié)果,在字段數(shù)相同的情況下,在記錄的層次上進(jìn)行拼接,這篇文章主要給大家介紹了關(guān)于Mysql聯(lián)合查詢的那些事兒,需要的朋友可以參考下
    2022-11-11
  • 在MySQL字段中使用逗號(hào)分隔符的方法分享

    在MySQL字段中使用逗號(hào)分隔符的方法分享

    大多數(shù)開(kāi)發(fā)者應(yīng)該都遇到過(guò)在mysql字段中存儲(chǔ)逗號(hào)分割字符串的經(jīng)歷,無(wú)論這些被分割的字段代表的是id還是tag,這個(gè)字段都應(yīng)該具有如下幾個(gè)共性
    2012-06-06
  • CentOS7版本安裝Mysql8.0.20版本數(shù)據(jù)庫(kù)的詳細(xì)教程

    CentOS7版本安裝Mysql8.0.20版本數(shù)據(jù)庫(kù)的詳細(xì)教程

    這篇文章主要介紹了CentOS7版本安裝Mysql8.0.20版本數(shù)據(jù)庫(kù)的教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論