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

 

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