uuidを数値型に改造するアルゴリズム


主管はuuidを数値型に改造し、同じ会社のデータidをもっと近づける考えを提出した.一つは空間を節約することであり、二つ目はtidbが数値型idを必要として分表することであり、同じ会社のデータidがもっと近いことで検索効率を高めることができるかもしれない.
会社は2バイトの数値型256*256を使っています.つまり、最大65536社で、一般的には十分です.その後、他のデータのidは8バイトを使用します.
バイナリの構造から言えば、前の2バイトは会社idを保存し、中間の4バイトは時間の秒数を保存し、後の2バイトはシーケンス番号を保存し、最大値も65536である.このように理論的には、1社1秒に使えるidは65536個で、基本的には十分です.最後のシーケンス番号が65536を超える場合は、1秒待ちます.
idを生成するときに会社idに転送され、現在の時間を使用して、秒ごとにシーケンス番号が保持され、このシーケンス番号はこの秒に重ねられます.最後に生成されたLong型id式は
[会社id]*2^(6*8)+[現在時刻秒数]*2^(2*8)+[シーケンス番号0-65535]
固定値を算出すると
[会社id]*28147476710656+[現在時間秒数]*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