work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MyCat子表

Posted on 2020-11-13 15:54  work hard work smart  阅读(252)  评论(0编辑  收藏  举报

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中。