手把手基于Mycat实现MySQL数据拆分( 二 )

 
配置mycat的schema.xml配置文件
sqlschema="false" sqlMaxLimit="100" dataNode="dn1"> select user() select user()
配置rule.xml配置文件
customer_id mod-long 2
在dn2上创建orders表,重启mycat,登陆mycat新增数据到orders表中
-- 我们以前添加,sql语法表名后的字段名可以省略,但是mycat分库分表添加数据不可省略,因为需要指明哪一列数据是customer_id INSERT INTO orders(id,order_type,customer_id,amount)VALUES(1,101,100,100100); INSERT INTO orders(id,order_type,customer_id,amount)VALUES(2,101,100,100300); INSERT INTO orders(id,order_type,customer_id,amount)VALUES(3,101,101,120000); INSERT INTO orders(id,order_type,customer_id,amount)VALUES(4,101,101,103000); INSERT INTO orders(id,order_type,customer_id,amount)VALUES(5,102,101,100400); INSERT INTO orders(id,order_type,customer_id,amount)VALUES(6,102,100,100020);

手把手基于Mycat实现MySQL数据拆分

文章插图
 
 
通过上图可以看出我们在mycat中添加6条数据,在mycat端可以全量查出,但是顺序并不是按照id排序的,如果想要飘絮可以使用order by语句,在stt201和stt202上分别查出3条数据,这样就实现了数据的水平拆分
 
水平拆分的join关联查询
手把手基于Mycat实现MySQL数据拆分

文章插图
 
 
看上图可以发现我们使用join内关联查询时会提示说order_detail表找不到,我们对orders表进行了切分也需要对orders的子表order_detail也进行切分配置
 
schema.xml文件
在dn2上创建order_detail表,重启mycat插入数据再做查询
-- 插入数据和查询都是在mycat端操作 -- 插入数据 INSERT INTO order_detail(id,detail,order_id)VALUES(1,'detail',1); INSERT INTO order_detail(id,detail,order_id)VALUES(2,'detail',2); INSERT INTO order_detail(id,detail,order_id)VALUES(3,'detail',3); INSERT INTO order_detail(id,detail,order_id)VALUES(4,'detail',4); INSERT INTO order_detail(id,detail,order_id)VALUES(5,'detail',5); INSERT INTO order_detail(id,detail,order_id)VALUES(6,'detail',6); -- 连接查询 SELECT * FROM orders o inner join order_detail od on o.id = od.order_id;
手把手基于Mycat实现MySQL数据拆分

文章插图
 
 
到此我们的垂直拆分和水平拆分就告一段落,当然还没有结束,真是XXXX了,咋还没完心态炸裂,不慌大家老规矩喝杯茶继续搞 。
 
全局表
我们的业务表比如orders、order_detail表数据量很多时就需要切分,但是还一些附属表,比如我们这里的dict_order_type(字典表),他们之间也要关联,字典表数据并不多,数据变动不频繁进行切片就没有必要,这种表Mycat中定义为全局表
特点
 
  • 全局表的插、更新操作会实时在所有节点上执行,保持各个分片的一致性
  • 全局表的查询操作,只从一个节点获取
  • 全局表可以跟任意一个表进行JOIN操作
 
修改schema.xml配置文件
保存在dn2上创建字典表,重启mycat
INSERT INTO dict_order_type(id,order_type) VALUES(101,'type1'); INSERT INTO dict_order_type(id,order_type) VALUES(102,'type2');
 
我们查询数据在dn1和dn2都有完整的两条数据,虽然存在数据冗余,但是好在这些表中的数据并不多,不用切分实现JOIN查询
 
常用分片规则
我们在上边的例子中切分数据时使用的是取模切分,这里我们说一说其他开发中经常用到的数据切分方式
枚举分片
在配置文件中配置可能用到的枚举ID,自己设置分片,比如按照省份或者区县来做保存,而全国的省份区县是固定的,可以使用在这些场景下
修改schema.xml配置文件
修改rule.xml配置文件
areacode hash-int ...... partition-hash-int.txt 1 0
修改partition-hash-int.txt配置文件
110=0 120=1
重启mycat,创建表插入数据
-- 创建表 CREATE TABLE orders_ware_info( id INT AUTO_INCREMENT, order_id INT, address VARCHAR(20), areacode VARCHAR, PRIMARY KEY(id) ); -- 插入数据 INSERT INTO orders_ware_info(id,order_id,address,areacode) VALUES (1,1,'北京','110'); INSERT INTO orders_ware_info(id,order_id,address,areacode) VALUES (2,2,'天津','120');
手把手基于Mycat实现MySQL数据拆分


推荐阅读