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/
欢迎任何形式的转载,未经作者同意,请保留此段声明!