MyCat子表

1、什么是子表,

比如购买商品的订单表,有订单表(包括订单的主题信息,订单编号,订单收货地址,...),订单OrderItem(商品Id,商品名称,金额,...).

这里的订单OrderItem就是子表

问题场景:

订单表水平切分:

根据订单编号取模插入,模为0,插入第一个数据库; 模为1,插入第二个数据库。

此时订单明细表,应该如何切分数据呢?

如果也使用取模分片,则订单Item分布在两个数据库中。

根据订单Id进行查询,订单信息和订单Item信息可能出现夸库的情况。

MyCat子表就是为了解决这个问题,保证一条记录的Order和OrderItem保存在一个分片库中,查询的时候就不需要夸库关联了。

2、子表配置

配置schema.xml

childTable标签,定义分片子表

name属性,子表名称

joinKey属性,标志子表中的列,用于与父表做关联。

parentKey标签,标志父表中的列,与joinKey对应。

needAddLimit属性,同table标签

3、创建表

在192.168.127.129中创建order表

  

在192.168.127.129中创建order_item表

同理,在192.168.127.134中创建order表和order_item表

4、配置schema.xml

 auto-sharding-long是根据id进行分片的。

rule.xml

 重启mycat或者重新加载配置  reload @@config_all

5、在Mycat中插入数据

1)  往order表插入数据

INSERT INTO  `order` (`id`,`total_amount`,`order_status`) VALUES('1', '100', '1') ;

可以看到数据插入到了节点1的192.168.127.134这台

往order_item表插入数据。这里的order_id和order表的id保持一致。

INSERT INTO `order_item` (`id`,`order_id`, `product_name`,`num`) VALUES('1','1','西瓜','5') ;

则可以看到节点1的192.168.127.134中已经有了这条数据。

2) 插入第二条数据

INSERT INTO `order` (`id`,`total_amount`,`order_status`) VALUES('6000000', '100', '1') ;
INSERT INTO `order_item` (`id`,`order_id`, `product_name`,`num`) VALUES('2','6000000','西瓜','5') ;

可以发现这两条数据都在节点2的192.168.127.129中。

作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!

原文地址:https://www.cnblogs.com/linlf03/p/13969527.html