MyCAT ER分片的说明

在此地,构造了零星摆设表,熟悉Oracle的童鞋都知,dept(部门表明)和emp(员工表),其中dept中之deptno是emp表中dept_no的外键。

星星阐明底建表语句如下:

create table dept(deptno int,dname varchar(10),datanode varchar(10));

create table emp(empno int,dept_no int,datanode varchar(10));

小心:在此间,最后一排都是datanode,通过插入database()函数可以好直观的拿走插入的节点名,从而证实分片的作用。

个别测试以下简单栽状况:

  1. 父表按照主键ID分片,子表的分片字段与主表ID关联,配置为ER分片
  2. 父表的分片字段为其它字段,子表的分片字段与主表ID关联,配置也ER分片

首先测试第一种植情景,在此间,dept表作为父表,主键是deptno,empno为子表,关联字段为dept_no,分片字段为deptno。

schema.xml中的布置如下:

 <table name="dept" primaryKey="deptno" dataNode="dn1,dn2,dn3"
                rule="sharding-by-intfile">
                <childTable name="emp" primaryKey="empno" joinKey="dept_no"
                                parentKey="deptno">
                        </childTable>
  </table>

rule.xml中之配置如下:

 <tableRule name="sharding-by-intfile">
                <rule>
                        <columns>deptno</columns>
                        <algorithm>hash-int</algorithm>
                </rule>
        </tableRule>

改好简单,就是以原的id修改为deptno,代表分片的字段

 partition-hash-int.txt的价值修改为:

10=0

20=1

 

证如下:

安插父表的价,

datanode为db1,与partition-hash-int.txt中之配备相符

mysql> insert into dept(deptno,dname,datanode) values(10,'ACCOUNTING',database());
Query OK, 1 row affected (0.05 sec)

mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | datanode |
+--------+------------+----------+
|     10 | ACCOUNTING | db1      |
+--------+------------+----------+
1 row in set (0.12 sec)

日记输出信息如下:

图片 1

连片下去插入子表的值

mysql> insert into emp(empno,dept_no,datanode) values(7788,10,database());
Query OK, 1 row affected (0.01 sec)

日记输出信息如下:

图片 2

重大点在“using parent partion rule
directly”。意思是直动用大之分片规则。如果表本身并不曾点名外键约束。

尽管如此就父并没有相应的主键值,子表依旧可以插,只要分片规则中拥有定义。

正如所示:

mysql> select * from emp;
+-------+---------+----------+
| empno | dept_no | datanode |
+-------+---------+----------+
|  7788 |      10 | db1      |
+-------+---------+----------+
1 row in set (0.52 sec)

mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | datanode |
+--------+------------+----------+
|     10 | ACCOUNTING | db1      |
+--------+------------+----------+
1 row in set (0.13 sec)

mysql> insert into emp(empno,dept_no,datanode) values(1234,20,database());
Query OK, 1 row affected (0.09 sec)

尽管dept中没有deptno为20的行。

但是emp还是能够插入dept_no为20的值

日记的输出信息如下:

图片 3

因而,对于第一种状况,即父表按照主键分片,字表的分片字段与主表关联,结论就是是,子表进行insert操作时,并无见面检讨父表中是否发有关的主键(对于子表的外键),而是直接冲分片规则进行判定。

假使分片规则中从不概念,则会报如下错误:

mysql> insert into emp(empno,dept_no,datanode) values(1234,30,database());
ERROR 1064 (HY000): can't find datanode for sharding column:DEPTNO val:30

 

  1. 父表的分片字段为另外字段,子表的分片字段与主表ID关联,配置为ER分片

每当此地,打算就此dname作为分片字段,这样的话,只待改route.xml和partition-hash-int.txt了。

首先,修改rule.xml

<tableRule name="sharding-by-intfile">
                <rule>
                        <columns>dname</columns>
                        <algorithm>hash-int</algorithm>
                </rule>
        </tableRule>

<function name="hash-int"
                class="org.opencloudb.route.function.PartitionByFileMap">
                <property name="mapFile">partition-hash-int.txt</property>
                <property name="type">1</property>
        </function>

坐dname是字符类型,故将type设置也1。

就,修改算法配置文件的价

[root@mysql-server1 conf]# cat partition-hash-int.txt 
accounting,research=0
sales=1
operations=2

报到mycat管理端口,重新加载配置文件

[root@mysql-server1 conf]# mysql -h192.168.244.145 -utest -ptest
-P9066

mysql> reload @@config;
Query OK, 1 row affected (0.14 sec)
Reload config success

本进展测试:

mysql> insert into dept(deptno,dname,datanode) values(10,'accounting',database());
Query OK, 1 row affected (0.14 sec)
mysql> insert into emp(empno,dept_no,datanode) values(1234,10,database());
Query OK, 1 row affected (0.29 sec)

日记的出口信息如下:

图片 4

插入第二个分区中之值

mysql> insert into dept(deptno,dname,datanode) values(20,'sales',database());
Query OK, 1 row affected (0.01 sec)

mysql> insert into emp(empno,dept_no,datanode) values(1234,20,database());
Query OK, 1 row affected (0.41 sec)

日志的输出信息如下:

图片 5

这次是当点滴独分区查找子表的分区节点

安插第三单分区中的价

mysql>  insert into dept(deptno,dname,datanode) values(30,'operations',database());
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp(empno,dept_no,datanode) values(4567,30,database());
Query OK, 1 row affected (0.62 sec)

日记的出口信息如下:

图片 6

于三独分区中查找子表的分区节点

小结:在父表的分片字段为其它字段,子表的分片字段与主表ID关联这种情景下,子表的分区节点是逐一查找的,在该例中,依次从dn1,dn2和dn3饱受摸索,如果dn1中留存,就直接插入到dn1中,反之,则持续查找dn2节点,如果以不存,则连续以dn3节点着找。

相关文章