内容简介:随着业务量的增长和国际化的需求,多区域部署已是家常便饭,如果各区域数据需要互通那数据库id就要全局唯一,自建sequence作为一种自增id就是为了解决mysql多区域部署id冲突问题。使用sequence作为mysql增长id唯一麻烦之处就在于要控制id段,如果id段划分太小容易出现id冲突,划分太大又容易出现新增区域id不足的问题,所以需要评估业务量,当然如果不在乎id是否有序,使用snowflake生成uuid也是一种不错的选择。
随着业务量的增长和国际化的需求,多区域部署已是家常便饭,如果各区域数据需要互通那数据库id就要全局唯一,自建sequence作为一种自增id就是为了解决 mysql 多区域部署id冲突问题。
优劣势
优点
- 和uuid相比较,sequence配置在数据库中不依赖机器环境,且是有序的
- 和mysql自增id相比较,适用于多区域部署,可以划分id段且随时可控
缺点
- 需要根据业务评估id段,并在后期需要时进行调整
- 单区域id增长过快时,id分配不平均,已分配的id段不可用会造成id浪费
划分原则
- 推荐使用bigint,不要使用bigint unsigned,因为bigint unsigned超出了long和int64的范围,很多软件包会报错
- bigint最大值为9223372036854775807,为方便扩展id划分时不要一次性全部分配完,如中国0-10e,美国10e-20e,欧洲20e-30e,当新增区域或者某一区域id段使用完时再新增id段,如美国修改sequence起始为30e
具体操作
-
检查mysql 自定义函数功能是否开启
执行
show variables like '%log_bin_trust_function_creators%'
检查是否开启,如aws默认是没开启的需要修改数据库配置,执行SET GLOBAL log_bin_trust_function_creators=1;
打开该功能,如遇到权限问题修改原始配置 -
创建sequence表
-- sequence表 DROP TABLE IF EXISTS sequence; -- 建sequence表,指定seq列为大整型,可支持:0(default)到9223372036854775807(0到2^63–1)。 CREATE TABLE sequence ( name VARCHAR(50) NOT NULL, -- 表名 current_value BIGINT NOT NULL DEFAULT 0, -- 当前值 increment INT NOT NULL DEFAULT 1, -- 步长 PRIMARY KEY (name) -- 不允许重复seq的存在 ) ENGINE=InnoDB; 复制代码
-
创建函数
-
function获取当前id
-- DELIMITER的作用是修改分隔符,因为语句中包含有分号需要替换成其他分隔符 DELIMITER / DROP FUNCTION IF EXISTS currval / CREATE FUNCTION currval(seq_name VARCHAR(50)) RETURNS BIGINT BEGIN DECLARE value BIGINT; SELECT current_value INTO value FROM sequence WHERE upper(name) = upper(seq_name); -- 大小写不区分. RETURN value; END; / DELIMITER ; 复制代码
-
function获取下一个id
DELIMITER / DROP FUNCTION IF EXISTS nextval / CREATE FUNCTION nextval (seq_name VARCHAR(50)) RETURNS BIGINT BEGIN DECLARE value BIGINT; UPDATE sequence SET current_value = current_value + increment WHERE upper(name) = upper(seq_name); RETURN currval(seq_name); END; / DELIMITER ; 复制代码
- 检查函数是否创建成功
drop function 自定义函数名 show create function 自定义函数名 show function status alert function
insert into `sequence`(`name`,`current_value`,`increment`) values('session',1000,2) INSERT INTO `session`(`id`, `uid`, `sig`, `expired`) VALUES (nextval('session'),123,'1231',now())
结束语
使用sequence作为mysql增长id唯一麻烦之处就在于要控制id段,如果id段划分太小容易出现id冲突,划分太大又容易出现新增区域id不足的问题,所以需要评估业务量,当然如果不在乎id是否有序,使用snowflake生成uuid也是一种不错的选择。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- nacos部署使用mysql作为数据库
- 使用Kubernates和Docker将Spring Boot与MongoDB作为容器部署
- 使用Elasticsearch作为主数据存储
- 如何把MongoDB作为循环队列
- 使用 utterances 作为博客评论组件
- 作为项目经理应该串联起哪些流程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
引爆社群:移动互联网时代的新4C法则(第2版)
唐兴通 / 机械工业出版社 / 69.00元
社群已经被公认为是这个时代的商业新形态,原有的商业逻辑和方法被颠覆,新的基于社群的商业体系和规则亟待构建,今天几乎所有的企业都在为此而努力,都在摸索中前行。 本书提出的“新4C法则”为社群时代的商业践行提供了一套科学的、有效的、闭环的方法论,第1版上市后获得了大量企业和读者的追捧,“新4C法则”在各行各业被大量解读和应用,积累了越来越多的成功案例,被公认为是社群时代通用的方法论。也因此,第1......一起来看看 《引爆社群:移动互联网时代的新4C法则(第2版)》 这本书的介绍吧!