github.com/XiaoMi/Gaea@v1.2.5/docs/sequence-id.md (about)

     1  # 全局序列号说明
     2  
     3  ## 原理
     4  
     5  参考mycat生成全局唯一序列号的设计,在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每次读取多少个sequence,假设为K)等信息;
     6  
     7  Sequence获取步骤:
     8  
     9  1).第一次使用该sequence时,根据传入的sequence名称,从数据库这张表中读取current_value,和increment到gaea中,并将数据库中的current_value设置为原current_value值+increment值(实现方式是基于后续的存储函数)
    10  
    11  2).gaea将读取到current_value+increment作为本次要使用的sequence值,下次使用时,自动加1,当使用increment次后,执行步骤1)相同的操作.    
    12    
    13  gaea只会修改和查询这张表,使用前需要按照下文中配置table的步骤在这张表中插入一条记录。   
    14  若某次读取的sequence没有用完,系统就停掉了,则这次读取的sequence剩余值不会再使用。
    15  
    16  ## 如何使用
    17  
    18  如:tbl_user_info的id列使用全局自增序列号
    19  ``` 
    20  insert into gaea_test.tbl_user_info set name="zhangsan", age=15, id = nextval();
    21  ```
    22  
    23  ## 如何配置 
    24  在指定的slice的master上操作,完成以下配置。
    25  ### 配置db
    26  db: mycat
    27  ```
    28  create database mycat;
    29  ```
    30  ### 配置table
    31  table: mycat_sequence
    32  ``` 
    33  DROP TABLE IF EXISTS MYCAT_SEQUENCE;
    34  CREATE TABLE MYCAT_SEQUENCE (name VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 100, PRIMARY KEY(name)) ENGINE=InnoDB;
    35  ```
    36  
    37  ### 初始化table
    38  ``` 
    39  INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GAEA_TEST.TBL_USER_INFO', -99, 100);
    40  ```
    41  name由大写的db名称和table名称组成  
    42  increment可根据参考业务qps峰值配置  
    43  例:  
    44  如果要在database gaea_test里的tbl_user_info表中使用全局唯一序列号  
    45  name=>GAEA_TEST.TBL_USER_INFO  
    46  ``` 
    47  mysql> select * from mycat_sequence;
    48  +-------------------------+---------------+-----------+
    49  | name                    | current_value | increment |
    50  +-------------------------+---------------+-----------+
    51  | GAEA_TEST.TBL_USER_INFO |           700 |       100 |
    52  +-------------------------+---------------+-----------+
    53  ```
    54  
    55  ### 配置函数
    56  - 获取当前sequence的值: 
    57  ``` 
    58  DROP FUNCTION IF EXISTS mycat_seq_currval;
    59  DELIMITER $
    60  CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
    61  DETERMINISTIC
    62  BEGIN
    63  DECLARE retval VARCHAR(64);
    64  SET retval="-999999999,null";
    65  SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
    66  RETURN retval;
    67  END $
    68  DELIMITER ;
    69  ```
    70  
    71  - 设置sequence值: 
    72  ```
    73  
    74  DROP FUNCTION IF EXISTS mycat_seq_setval; 
    75  DELIMITER $ 
    76  CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS     varchar(64) CHARSET utf8
    77  DETERMINISTIC
    78  BEGIN
    79  UPDATE MYCAT_SEQUENCE
    80  SET current_value = value
    81  WHERE name = seq_name;
    82  RETURN mycat_seq_currval(seq_name);
    83  END $
    84  DELIMITER ;
    85  ```
    86  
    87  - 获取下一个sequence值:
    88   
    89  ```
    90  DROP FUNCTION IF EXISTS mycat_seq_nextval;
    91  DELIMITER $
    92  CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
    93  DETERMINISTIC
    94  BEGIN
    95  UPDATE MYCAT_SEQUENCE
    96  SET current_value = current_value + increment WHERE name = seq_name;
    97  RETURN mycat_seq_currval(seq_name);
    98  END $
    99  DELIMITER ;
   100  ```
   101