005MYCAT的分片join

Mycat目前版本支持跨分片的join,主要实现方式有四种。 全局表,ER分片,catletT(人工智能)和ShareJoin,ShareJoin在开发版中支持,前面三种斱方式1.3.0.1支持。

8.1 全局表

一个真实的业务系统中,往往存在多量的类似字典表的表格,这些表基本上很少变动,如图:

配置:

全局表配置比较简单,不用写Rule规则,如下配置即可:

 

在TESTDB下配置一个全局表province:

vi schema.xml

添加:

<table name="province" dataNode="node_db01,node_db02,node_db03" type="global"></table>


登陆9066端口, mysql -uroot -proot -h127.0.0.1 -P9066 -DTESTDB

执行命令:reload @@config_all;


  1. 建表:
  2. mysql -utest -ptest -h127.0.0.1 -P8066 -DUSERDB
  3. mysql> create table province( id int, name varchar( 30));
  4. Query OK, 0 rows affected (0.19 sec)
  5. mysql> insert into province( id, name) values( 1, 'beijing');
  6. Query OK, 3 rows affected (0.11 sec)
  7. mysql> select * from province limit 1;
  8. + ------+---------+
  9. | id | name |
  10. + ------+---------+
  11. | 1 | beijing |
  12. + ------+---------+
  13. 1 row in set ( 3.56 sec)
  14. 在mysql里的db10,db11,db12都能看到插入的数据:
  15. mysql> select * from db12.province;
  16. + ------+---------+
  17. | id | name |
  18. + ------+---------+
  19. | 1 | beijing |
  20. + ------+---------+
  21. 1 row in set ( 0.00 sec)
  22. mysql> select * from db11.province;
  23. + ------+---------+
  24. | id | name |
  25. + ------+---------+
  26. | 1 | beijing |
  27. + ------+---------+
  28. 1 row in set ( 0.01 sec)
  29. mysql> select * from db10.province;
  30. + ------+---------+
  31. | id | name |
  32. + ------+---------+
  33. | 1 | beijing |
  34. + ------+---------+
  35. 1 row in set ( 0.00 sec)


8.2 ER join

基于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。

分片在dn1,dn2上,orders依赖父表进行分片,两个表的关联关系为orders.customer_id=customer.id。示意图如下:

配置:

<tablen ame="customer" dataNode="dn1,dn2" rule="sharding-by-intfile">

 <childTable name="orders" joinKey="customer_id" parentKey="id"/>

 </table>

示例:

我先创建了一个分片规则:auto-sharding-long-custom

id属于0-1000范围内的在分区1里,1000-2000的在分区2里,2000-3000的在分片3里。

vi schema.xml

在USERDB处配置:

<table name="customer" dataNode="dn10,dn11,dn12" rule="auto-sharding-long-custom">

                         <childTable name="orders" joinKey="customer_id" parentKey="id"/>

</table>

登录9066端口,使得配置生效:

reload @@config_all;

  1. [root@PC conf]# mysql -u test -ptest -P8066 -h 127.0.0.1 TESTDB
  2. Reading table information for completion oftable and column names
  3. You can turn off this feature to get aquicker startup with -A
  4. Welcome to the MySQL monitor. Commands end with ; or \g.
  5. Your MySQL connection id is 1
  6. Server version: 5.5.8-mycat-1.3 MyCatServer (OpenCloundDB)
  7. Copyright (c) 2000, 2011, Oracle and/or itsaffiliates. All rights reserved.
  8. Oracle is a registered trademark of OracleCorporation and/or its
  9. affiliates. Other names may be trademarksof their respective
  10. owners.
  11. Type ' help;' or '\h' for help. Type '\c' toclear the current input statement.
  12. mysql> use USERDB;
  13. Reading table information for completion oftable and column names
  14. You can turn off this feature to get aquicker startup with -A
  15. Database changed
  16. mysql> show tables;
  17. + ------------------+
  18. | Tables in USERDB |
  19. + ------------------+
  20. | company |
  21. | customer |
  22. | employee |
  23. | orders |
  24. | province |
  25. + ------------------+
  26. 5 rows in set ( 0.01 sec)
  27. 建表:
  28. mysql> create table customer( id int primary key, name varchar( 30));
  29. Query OK, 0 rows affected (0.13 sec)
  30. mysql> create table orders( id int, name varchar( 30),customer_id int, constraint fk_companyid foreign key(customer_id) references customer( id));
  31. Query OK, 0 rows affected (0.25 sec)
  32. 插入几条数据:
  33. mysql> insert into customer( id, name) values( 999, 'dan'),( 1000, 'jiao'),( 1003, 'song'),( 2002, 'yang');
  34. mysql> insert into orders( id, name,customer_id) values( 1, 'mirror', 999),( 2, 'banana', 2002),( 3, 'apple', 1003),( 4, 'pear', 2002);
  35. ERROR 1064 (HY000): ChildTable multi insertnot provided
  36. 看来mycat子表不支持一次插入多条记录。
  37. mysql> insert into orders( id, name,customer_id) values( 1, 'mirror', 999);
  38. Query OK, 1 row affected (0.07 sec)
  39. mysql> insert into orders( id, name,customer_id) values( 2, 'banana', 2002)
  40. Query OK, 1 row affected ( 0.02 sec)
  41. mysql> insert into orders( id, name,customer_id) values( 3, 'apple', 1003);
  42. Query OK, 1 row affected (0.02 sec)
  43. mysql> insert into orders( id, name,customer_id) values( 4, 'pear', 2002);
  44. Query OK, 1 row affected (0.02 sec)
  45. 进入mysql验证:
  46. mysql> select * from db10.customer;
  47. + ------+------+
  48. | id | name |
  49. + ------+------+
  50. | 999 | dan |
  51. | 1000 | jiao |
  52. + ------+------+
  53. 2 rows in set ( 0.01 sec)
  54. mysql> select * from db11.customer;
  55. + ------+------+
  56. | id | name |
  57. + ------+------+
  58. | 1003 | song |
  59. + ------+------+
  60. 1 row in set ( 0.00 sec)
  61. mysql> select * from db12.customer;
  62. + ------+------+
  63. | id | name |
  64. + ------+------+
  65. | 2002 | yang |
  66. + ------+------+
  67. 1 row in set ( 0.00 sec)
  68. mysql> select * from db12.orders;
  69. + ------+--------+-------------+
  70. | id | name | customer_id |
  71. + ------+--------+-------------+
  72. | 2 | banana | 2002 |
  73. | 4 | pear | 2002 |
  74. + ------+--------+-------------+
  75. 2 rows in set ( 0.00 sec)
  76. mysql> select * from db11.orders;
  77. + ------+-------+-------------+
  78. | id | name | customer_id |
  79. + ------+-------+-------------+
  80. | 3 | apple | 1003 |
  81. + ------+-------+-------------+
  82. 1 row in set ( 0.00 sec)
  83. mysql> select * from db10.orders;
  84. + ------+--------+-------------+
  85. | id | name | customer_id |
  86. + ------+--------+-------------+
  87. | 1 | mirror | 999 |
  88. + ------+--------+-------------+
  89. 1 row in set ( 0.00 sec)
  90. 我们看到orders列customer_id对应的customer的 id属于哪个分片,orders的那条记录就在哪个分片内。
  91. 可以在mycat上正常地联合查询:
  92. mysql> select b.*,a.name as custome_name from customer a inner join orders b on a.id=b.customer_id;
  93. + ------+--------+-------------+--------------+
  94. | id | name | customer_id |custome_name |
  95. + ------+--------+-------------+--------------+
  96. | 2 | banana | 2002 |yang |
  97. | 4 | pear | 2002 | yang |
  98. | 1 | mirror | 999 |dan |
  99. | 3 | apple | 1003 | song |
  100. + ------+--------+-------------+--------------+
  101. 4 rows in set ( 0.02 sec)

 

8.3 share join

ShareJoin是一个简单的跨分片Join,基于HBT的方式实现。 目前支持2个表的join,原理就是解析SQL语句,拆分成单表的SQL语句执行,然后把各个节点的数据汇集。配置支持任意配置的A,B表如:

A,B的dataNode相同

A,B的dataNode不同 

示例:

我先创建了一个分片规则:auto-sharding-long-custom

id属于0-1000范围内的在分区1里,1000-2000的在分区2里。 

新定义两个处于不同分片中的两个表

vi schema.xml

在USERDB处添加:

<table name="student" primaryKey="ID" dataNode="dn10,dn11" rule="auto-sharding-long-custom"></table>

<table name="score" primaryKey="ID" dataNode="dn11,dn12" rule="auto-sharding-long-custom"></table>

登录9066端口,使得配置生效:

reload @@config_all;

  1. 建表:
  2. mysql> create table student( id int primary key, name varchar( 30));
  3. Query OK, 0 rows affected (0.19 sec)
  4. mysql> create table score( id int,studentid int,score int, constraint fk_studentid foreign key(studentid) references student( id));
  5. Query OK, 0 rows affected (0.13 sec)
  6. 插入数据:
  7. mysql> insert into student( id, name) values( 1, 'dan'),( 1002, 'jiao'),( 88, 'song');
  8. Query OK, 3 rows affected (0.33 sec)
  9. Records: 2 Duplicates: 0 Warnings: 0
  10. mysql> insert into score( id,studentid,score) values( 1, 1, 100);
  11. Query OK, 1 row affected (0.07 sec)
  12. mysql> insert into score( id,studentid,score) values( 1008, 88, 90);
  13. Query OK, 1 row affected (0.03 sec)
  14. mysql> insert into score( id,studentid,score) values( 8, 1002, 99);
  15. Query OK, 1 row affected (0.01 sec)
  16. 进mysql查询:
  17. mysql> select * from db10.student;
  18. + ----+------+
  19. | id | name |
  20. + ----+------+
  21. | 1 | dan |
  22. | 88 | song |
  23. + ----+------+
  24. 2 rows in set ( 0.01 sec)
  25. mysql> select * from db11.student;
  26. + ------+------+
  27. | id | name |
  28. + ------+------+
  29. | 1002 | jiao |
  30. + ------+------+
  31. 1 row in set ( 0.00 sec)
  32. mysql> select * from db12.student;
  33. ERROR 1146 (42S02): Table 'db12.student'doesn't exist
  34. mysql> select * from db10.score;
  35. ERROR 1146 (42S02): Table 'db10.score'doesn't exist
  36. mysql> select * from db12.score;
  37. + ------+-----------+-------+
  38. | id | studentid | score |
  39. + ------+-----------+-------+
  40. | 1008 | 88 | 90 |
  41. + ------+-----------+-------+
  42. 1 row in set ( 0.00 sec)
  43. mysql> select * from db11.score;
  44. + ------+-----------+-------+
  45. | id | studentid | score |
  46. + ------+-----------+-------+
  47. | 1 | 1 | 100 |
  48. | 8 | 1002 | 99 |
  49. + ------+-----------+-------+
  50. 2 rows in set ( 0.00 sec)
  51. 不使用 share join在mycat查询:
  52. mysql> select * from student a inner join score b on a.id=b.studentid;
  53. + ------+------+------+-----------+-------+
  54. | id | name | id | studentid | score|
  55. + ------+------+------+-----------+-------+
  56. | 1002 | jiao | 8 | 1002 | 99 |
  57. + ------+------+------+-----------+-------+
  58. 1 row in set ( 0.02 sec)
  59. 只查到了db11分区里面的数据。
  60. 使用 share join:
  61. mysql> /*!mycat:catlet=demo.catlets.ShareJoin */ select * from student a inner join score b on a.id=b.studentid;
  62. ERROR 1064 (HY000):java.lang.ClassNotFoundException: demo.catlets.ShareJoin
  63. Share join只在开发版本中支持,我的是mycat 1.3,所以不支持。假如支持的话,可以查出匹配的三条记录,而不是上面的一条。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值