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