uuid改造成數值型的算法

主管提出一個想法,把uuid改造成數值型的,並且讓同一個公司的數據id更相近,一是節省了空間,二是tidb需要數值型id來分庫分表,而且同一家公司的數據id更接近或許能提高查詢效率吧,大概。

公司使用兩個字節的數值型 256*256,就是說最多有65536家公司,一般來說是夠用了。然後其他數據的id則使用八個字節。

從二進制的結構來說,前兩個字節保存公司id,中間四個字節保存時間的秒數,後兩個字節保存序號,最大值也是65536。這樣理論上每一家公司在每一秒可以用的id是65536個,基本也夠用了。如果最後的序號超過65536,則等待一秒鐘。

生成id的時候傳入公司id,然後使用當前的時間,每一秒保持一個序號,這個序號在這一秒中不停疊加。最後生成的Long型id公式是

[公司id]*2^(6*8)+[當前時間秒數]*2^(2*8)+[序號0-65535]

把固定數值算出來就是

[公司id]*281474976710656+[當前時間秒數]*65536+[序號0-65535]

而過去的數據也可以利用sql語句進行轉化,公司id和時間可以從列裏面拿到,而序號可以用mysql臨時變量@num生成

set @num=0;
update table_example ada
join (
select id,if(@num<60000,@num:=@num+1,@num:=0) num,(companyId*281474976710656+timestampdiff(second, '2000-1-1 00:00:00', time)*65536+@num) newId
from table_example
where length(id) > 20
) Q on ada.id = Q.id
set ada.id = Q.newId

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章