목요일, 6월 09, 2016

인스타그램 ID mysql version

인스타그램 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();



결과 값

댓글 없음: