前端精度丢失/千万级数据库分库分表自增ID/mycat2 设置自增序列号的流程
由于mysql单表数据量达到千万级 优化了还是查询很慢。尝试使用mycat2 分库分表的时候 发现自增ID过长(默认雪花算法)导致前端精度丢失,可以把ID传值变成string解决。想想试一下修改成从1开始的自增序列,网上找的资料有限 官方的文档也不容易理解 试了半天才明白,于是记录一下。
官方文档地址
https://www.yuque.com/ccazhw/ml3nkf/545074ac9eadab63edbe211a7f770f64
1.执行dbseq.sql
在配置好mycat2 并能正常使用的情况下,注意:在物理库下使用 (端口为3306的称为物理库,8066的称为逻辑库)
执行完dbseq.sql之后 会生成 MYCAT_SEQUENCE的表,以及
mycat_seq_currval
mycat_seq_nextval
mycat_seq_nextvals
mycat_seq_setval
四个函数,这就算完成。
dbseq.sql 在mycat2-install-template-1.21.zip解压完的mycat/conf目录下
ps:执行完自己有重启过mycat 不知道需不需要这个步骤
2.创建文件
1.在mycat/conf/sequences目录下创建
{数据库名字}_{表名字}.sequence.json文件
例如db1_user.sequence.json db1是数据库 user是需要自增序列的表名
在这个.sequence.json文件里输入下面的命令并保存。
{
“clazz”:“io.mycat.plug.sequence.SequenceMySQLGenerator”,
“name”:“db1_user”
}
之前就是在这个name踩坑的 不理解这个name是什么 其实name要跟文件名的{数据库名字}_{表名字}一致。后面用到的name都要跟这个一致。
3.执行设置
在mycat(逻辑库)
通过注释设置为数据库方式全局序列号
/*+ mycat:setSequence{“name”:“db1_user”,“clazz”:“io.mycat.plug.sequence.SequenceMySQLGenerator”} */;
一样要注意这个name 跟.sequence.json文件里的name一致
执行完再去看db1_user.sequence.json文件
内容会变成
{
“clazz”:“io.mycat.plug.sequence.SequenceMySQLGenerator”,
“group”:false,
“name”:“db1_user”,
“noMaxValue”:false,
“noMinValue”:false,
“simple”:false,
“time”:false
}
说明设置成功了
4.MYCAT_SEQUENCE表添加数据
name:就是上面的name(db1_user)
current_value:当前自增序列值
increment:增量(默认1)
在表里添加一条数据
注意:name还是上面的那个name
结尾
1.可以通过注解设置为雪花算法
/*+ mycat:setSequence{“name”:“db1_user”,“time”:true} */;
一样name要写对。
2.需要修改自增序列的表都要从第二步重复设置。
3.如果之前库里有数据 然后又设置了自增序列,可能导致ID重复