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

  • 相关阅读:
    MySQL 5.7 Invalid default value for 'CREATE_TIME'报错的解决方法
    浅析mysql中exists 与 in 的使用
    mysql 索引原理
    内存溢出与内存泄漏
    java 内部类详解
    JAVA中重写equals()方法的同时要重写hashcode()方法
    Java中volatile关键字解析
    JDK1.8 HashMap源码分析
    mysql 行转列 列转行
    Java多线程(十)——线程优先级和守护线程
  • 原文地址:https://www.cnblogs.com/linlf03/p/13969527.html
Copyright © 2011-2022 走看看