博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyCAT ER分片的验证
阅读量:6272 次
发布时间:2019-06-22

本文共 3879 字,大约阅读时间需要 12 分钟。

在这里,构造了两张表,熟悉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中的配置如下:

rule.xml中的配置如下:

deptno
hash-int

修改很简单,就是将原来的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)

日志输出信息如下:

接下来插入子表的值

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

日志输出信息如下:

关键点在于“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的值

日志的输出信息如下:

所以,对于第一种情况,即父表按照主键分片,字表的分片字段与主表关联,结论就是,子表进行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

 

2. 父表的分片字段为其他字段,子表的分片字段与主表ID关联,配置为ER分片

在这里,打算用dname作为分片字段,这样的话,只需要修改route.xml和partition-hash-int.txt了。

首先,修改rule.xml

dname
hash-int
partition-hash-int.txt
1

因dname是字符类型,故将type设置为1。

接着,修改算法配置文件的值

[root@mysql-server1 conf]# cat partition-hash-int.txt accounting,research=0sales=1operations=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)

日志的输出信息如下:

插入第二个分区中的值

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)

日志的输出信息如下:

这次是在两个分区查找子表的分区节点

插入第三个分区中的值

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)

日志的输出信息如下:

在三个分区中查找子表的分区节点

总结:在父表的分片字段为其他字段,子表的分片字段与主表ID关联这种情况下,子表的分区节点是顺序查找的,在该例中,依次从dn1,dn2和dn3中查找,如果dn1中存在,就直接插入到dn1中,反之,则继续查找dn2节点,如果仍不存在,则继续在dn3节点中查找。

转载地址:http://ywlpa.baihongyu.com/

你可能感兴趣的文章
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>