인스타그램 ID mysql version
2016년
4월 5일 화요일
오후
12:28
MySQL 유티크 ID 생성
/*
unix 시스템의 unix epoch는 1970-01-01 부터 시작
ms --> datetime 은 기준 epoch로 부터 경과시간을 더 한 후 계산한다
current datetiem -> base epoch + 경과ms -> from_unixtime()
41bit
--> milliseconds
13bit --> 논리적샤드ID(13bit로 표현할 수 있는 한계 8,191개)
10bit --> 10bit로 표현할 수 있는 개수 1024개
*/
use cnsdb;
drop table if exists uid_seq;
create table uid_seq (
id bigint not null auto_increment primary
key
);
select * from uid_seq;
insert into uid_seq values (0);
drop function if exists uid_next_id;
DELIMITER $$
create function
uid_next_id()
returns bigint
begin
declare our_epoch bigint;
declare seq_id bigint;
declare shard_id int;
declare now_millis bigint;
declare rst bigint;
#shard
id --> 1로 고정
set shard_id =
1;
/*
2016-04-05 02:53:24.0230 --> 1459824804023
*/
set our_epoch=1459824804023;
/*
select AUTO_INCREMENT into @seq_id
from information_schema.tables
where table_name = 'gen_seq'
and table_schema= DATABASE();
*/
insert into uid_seq values (0);
select mod(last_insert_id(),1024) into seq_id;
select floor(UNIX_TIMESTAMP(CURTIME(4))*1000) into now_millis;
set rst = (now_millis - our_epoch) << 23;
set rst = (rst | (shard_id << 10));
set rst = (rst | (seq_id));
return rst;
end;
$$
DELIMITER ;
select uid_next_id();
결과 값
댓글 없음:
댓글 쓰기