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)
日志输出信息如下:
接下来插入子表的值
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
<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=
sales=
operations=
登录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节点中查找。
MyCAT ER分片的验证的更多相关文章
- mycat ER分片
有一类业务,例如订单(ORDER)跟订单明细表(ORDER_DETAIL),明细表会依赖于订单,就是该会存在表的主从关系,这类似业务的切分可以抽象出合适的切分规则,比如根据用户ID切分,其它相关的表都 ...
- mycat ER 分片表
<table name="order" dataNode="dn$1-32" rule="mod-long"> <chil ...
- MyCat 学习笔记 第十篇.数据分片 之 ER分片
1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键 ...
- mycat读写分离+垂直切分+水平切分+er分片+全局表 测试
原文http://blog.163.com/bigoceanwu@126/blog/static/172718064201683031639683/ 读写分离:利用最基础的mysql主从复制,事务性的 ...
- MyCat 枚举分片设计思考,查询命中条件
Mycat多租户实现的两种方式 MyCat,各种分片规则,仅保证插入的时候分片.表关联,join,查询怎么命中分片条件,还是需要设计. 今天稍微测了一下. ER 分片,此方式,插入的时候能分片,但是查 ...
- Mycat跨分片Join
1 前言 Mycat目前版本支持跨分片的join,主要实现的方式有四种. 全局表 ER分片 HBT(参考MyCAT人工智能解决跨分片SQL.docx) ShareJoin ShareJoin在开发版中 ...
- Mysql系列六:(Mycat分片路由原理、Mycat常用分片规则及对应源码介绍)
一.Mycat分片路由原理 我们先来看下面的一个SQL在Mycat里面是如何执行的: , ); 有3个分片dn1,dn2,dn3, id=5000001这条数据在dn2上,id=10000001这条数 ...
- JAVAEE——宜立方商城13:Mycat数据库分片、主从复制、读写分离、100%Linux中成功安装Mysql的方法
1 海量数据的存储问题 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个时候NoSQL ...
- JAVAEE——宜立方商城13:订单系统实现、订单生成、Mycat数据库分片
1. 学习计划 1.订单系统实现 2.订单生成 3.Mycat数据库分片 2. 订单系统 2.1. 功能分析 1.在购物车页面点击“去结算”按钮,跳转到订单确认页面 a) 必须要求用户登录 b) 使用 ...
随机推荐
- 【Python】引用计数
一.概述 要保持追踪内存中的对象,Python使用了引用计数这一简单的技术. 二.引用计数的增减 2.1 增加引用计数 当对象被创建并(将其引用)赋值给变量时,该对象的引用计数被设置为1. 对象的引用 ...
- Convert PLY to VTK Using PCL 1.6.0 使用PCL库将PLY格式转为VTK格式
PLY格式是比较流行的保存点云Point Cloud的格式,可以用MeshLab等软件打开,而VTK是医学图像处理中比较常用的格式,可以使用VTK库和ITK库进行更加复杂的运算处理.我们可以使用Par ...
- Unity自动寻路Navmesh之高级
隔离层自动生成寻路网格 (源码scene1.unity) 1.创建Plane实例P1,P2,两者之间出现一条鸿沟.直接控制角色位移是无法通过的. 2.打开Navigation窗口,分别选中P1,P2, ...
- android——数据库版本升/降级问题
数据库版本升级 在开发android应用程序的时候,一般由于在我们开发的时候我们不知道以后会后什么新功能,也有可能增加业务逻辑(也就是更新),可想而知我们原来的数据库结构可能不适用已更新的应用,那么应 ...
- adb devices出现no permissions
在做Android开发的时候,有些设备插入USB调试线,无法调试,出现以下错误: joey 09:58 $ adb devices List of devices attached 20080411 ...
- TLogger一个D7可用的轻量级日志
今天调程序,要用到日志.XE7有Qlog,D7用什么 从网上找到了Logger,下载的原文是不支持D7的,不过也只是很少的地方不同,自己修改了下就可以用了 感谢原作者和红鱼的分享 unit Logge ...
- RPC 的概念模型与实现解析
今天分布式应用.云计算.微服务大行其道,作为其技术基石之一的 RPC 你了解多少?一篇 RPC 的技术总结文章,数了下 5k+ 字,略长,可能也不适合休闲的碎片化时间阅读,可以先收藏抽空再细读:) 全 ...
- Mono 3.0.12 支持可移植类库
Mono 3.0.12已于6月19日发布.对跨平台开发者而言,对可移植类库的支持可能是该版本最重要的变化.该技术可以使一个DLL支持.NET.Windows Store.Windows Phone.S ...
- [PDO绑定参数]使用PHP的PDO扩展进行批量更新操作
最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用了PDO做参数绑定,其中遇到了一个坑. 方案选择 笔者已知的做批量更新有以下几种方案: 1.逐条更新 这种是最简单的方案,但无疑也 ...
- 玩转JavaScript OOP[1]——复杂类型
概述 在JavaScript中,我们可以使用函数.数组.对象,以及日期.正则等一些内置类型的实例,它们都是复杂类型的表现.从本质上讲,这些复杂类型都是Object类型.本篇将主要介绍三种Object类 ...