上一篇 <<<MyCat实现读写分离与动态数据源切换
下一篇 >>>MyCat的分片查询原理
1.分表分库存在的问题
2.自增ID问题解决办法
查询自增的步长
SHOW VARIABLES LIKE 'auto_inc%'
修改自增的步长
SET @@auto_increment_increment=10;
修改起始值
SET @@auto_increment_offset=5;
假设有两台mysql数据库服务器
节点①自增 1 3 5 7 9 11 ….
节点②自增 2 4 6 8 10 12 ….
b、UUID形式,缺点是不能排序
c、使用雪花算法或redis解决
3.数据库分表分库策略
3.1垂直拆分
3.2水平拆分
3.3水平拆分策略
3.3.1 求模算法
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="role1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!--指定分片数量,不可以被更改-->
<property name="count">3</property>
</function>
</mycat:rule>
create table user(id bigint not null auto_increment primary key,name varchar(100));
INSERT INTO `user`(`id`,`name`)
VALUES
(1,'dd'),
(2,'tt'),
(3,'cc'),
(4,'ww'),
(5,'kk');
select * from `user`;
3.3.2 分片枚举
1.案例步骤:
创建数据库userdb_1 、 userdb_2、userdb_3
2.修改partition-hash-int.txt 规则
wuhan=0
shanghai=1
suzhou=2
规则:
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="role2">
<rule>
<!--将要分片的表字段-->
<columns>name</columns>
<!--分片函数-->
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<!--标识配置文件名称-->
<property name="mapFile">partition-hash-int.txt</property>
<!--type默认值为0,0表示Integer,非零表示String-->
<property name="type">1</property>
<!--所有的节点配置都是从0开始,即0代表节点1
defaultNode 设置默认节点:小于0表示不设置默认节点,大于等于0表示设置默认节点
如果碰到不识别的枚举值,就让它路由到默认节点
若默认节点未配置则报错: like this:can't find datanode for sharding column:column_name val:ffffffff
-->
<property name="defaultNode">1</property>
</function>
</mycat:rule>
3.3.3、范围约定--此分片适用于提前规划好分片字段某个范围属于哪个分片
3.3.4、日期指定--按日期(天)分片
3.3.5、固定分片hash算法---类似于Hashmap,缺点是数据分布不均匀
3.3.6、通配取模
3.3.7、ASCII码求模通配
3.3.8、编程指定
3.3.9、字符串拆分hash解析
推荐阅读:
<<<MySQL自带主从复制原理
<<<MyCat实现读写分离与动态数据源切换
<<<MyCat的分片查询原理
<<<Sharding-Jdbc实现读写分离
<<<Sharding-Jdbc的分片算法及分表分库
<<<Sharding-Jdbc与MyCat区别