配置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中添加6条数据,在mycat端可以全量查出,但是顺序并不是按照id排序的,如果想要飘絮可以使用order by语句,在stt201和stt202上分别查出3条数据,这样就实现了数据的水平拆分
水平拆分的join关联查询

文章插图
看上图可以发现我们使用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;
文章插图
到此我们的垂直拆分和水平拆分就告一段落,当然还没有结束,真是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');
推荐阅读
- 手把手教你如何追到天秤女
- 手把手教你在家做清蒸鲈鱼
- |手把手教你盘玩木雕把件
- 手把手教你如何清理打印机喷头 如何清洗打印头
- 手把手教你如何用手机快速将图片中文字提取出来
- 手把手教您在家蒸包子 自己在家做包子的方法
- 郭富城|郭富城手把手教小朋友写字,不到一分钟筹得近百万,每个字值23万
- 金晨|张继科金晨撒狗粮啦!张继科手把手教金晨打乒乓球,画面太甜了!
- Java探针-Java Agent技术
- 热热闹闹过圣诞,怎么布置圣诞节场景手把手教
