mycat ER分片
有一类业务,例如订单(ORDER)跟订单明细表(ORDER_DETAIL),明细表会依赖于订单,就是该会存在表的主从关系,
这类似业务的切分可以抽象出合适的切分规则,比如根据用户ID切分,其它相关的表都依赖于用户ID,再或者根据订单ID进行切分,
总之部分业务总会可以抽象出父子关系的表。这类表适用于ER分片表,子表的记录与所关联的父表记录存放在同一个数据分片上,
避免数据Join跨库操作,以order与order_detail例子为例,schema.xml中定义合适的分片配置,order,order_detail 根据order_id
迕行数据切分,保证相同order_id的数据分到同一个分片上,在进行数据插入操作时,Mycat会获取order所在的分片,
然后将order_detail也插入到order所在的分片
# vi /usr/local/mycat/conf/schema.xml
<table name="order" dataNode="dn1,dn2,dn3" rule="auto-sharding-long">
<childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
</table>
在db1,db2,db3上分别运行建表语句
CREATE TABLE `order` (
`id` int(11) NOT NULL,
`sn` varchar(64) CHARACTER SET latin1 NOT NULL,
`create_time` datetime NOT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `order_detail` (
`id` int(11) NOT NULL,
`order_id` int(11) NOT NULL,
`address` varchar(128) NOT NULL,
`create_time` datetime NOT NULL,
KEY `fk_ordid` (`order_id`),
CONSTRAINT `fk_ordid` FOREIGN KEY (`order_id`) REFERENCES `order` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
通过8066端口执行插入SQL
INSERT INTO `order` (id,sn,create_time) VALUES (1, 'BJ0001', NOW());
INSERT INTO order_detail(id,order_id,address,create_time) VALUES (1,1,'test data of ORDER1(ID=1,BJ001) ',NOW());
INSERT INTO `order` (id,sn,create_time) VALUES (2, 'BJ0002', NOW());
INSERT INTO order_detail(id,order_id,address,create_time) VALUES (2,2,'test data of ORDER1(ID=1,BJ002) ',NOW());
INSERT INTO order_detail(id,order_id,address,create_time) VALUES (3,2,'test data of ORDER1(ID=1,BJ002) ',NOW());
INSERT INTO `order` (id,sn,create_time) VALUES (3, 'BJ0003', NOW());
INSERT INTO order_detail(id,order_id,address,create_time) VALUES (4,3,'test data of ORDER1(ID=1,BJ003) ',NOW());
INSERT INTO order_detail(id,order_id,address,create_time) VALUES (5,3,'test data of ORDER1(ID=1,BJ003) ',NOW());
INSERT INTO `order` (id,sn,create_time) VALUES (4, 'BJ0004',NOW());
INSERT INTO order_detail(id,order_id,address,create_time) VALUES (6,4,'test data of ORDER1(ID=1,BJ004) ',NOW());
根据mod-long按照节点数目取模的结果
<?php
echo 1%3;
echo '<br>';
echo 2%3;
echo '<br>';
echo 3%3;
echo '<br>';
echo 4%3;
结果:
1
2
0
1
就是id为3的所有记录都会在dn1(第0个节点),id为1和4的记录都会在dn2(第1个节点),id为2的会在dn3(第2个节点)
查看dn1的记录

查看dn2的记录

查看dn3的数据

实验结果:全部符合预期,字表完全符合关联规则。

mycat ER分片的更多相关文章
- MyCAT ER分片的验证
在这里,构造了两张表,熟悉Oracle的童鞋都知道,dept(部门表)和emp(员工表),其中dept中的deptno是emp表中dept_no的外键. 两表的建表语句如下: create table ...
- 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) 使用 ...
随机推荐
- oracle 11G R2卸载说明
oracle 11G R2数据库卸载
- Codeforces Round #668 (Div. 2)A-C题解
A. Permutation Forgery 题目:http://codeforces.com/contest/1405/problem/A 题解:这道题初看有点吓人,一开始居然想到要用全排序,没错我 ...
- Mac Item2自动远程连接服务器
Mac Item2自动远程连接服务器 1.编写脚本 vi test #!/usr/bin/expect set PORT 端口 set HOST ip set USER root set PASSWO ...
- java中变量在内存的位置
package day02; /* * 成员变量:在堆内存中,因为对象的存在,才在内存中存在:作用于整改类中 * 局部变量:在栈内存中:作用于函数中,或者语句中 * */ class car{ //描 ...
- 微信小程序实现滚动视频自动播放(未优化)
先看看大概效果 1.首先需要了解微信API: wx.createIntersectionObserver(Object component, Object options) 创建并返 ...
- vue 通过css实现输入框居中输入
今天开发时突然想写blog了,水一下(o゚v゚)ノ css代码 .inputStyle { text-align: center;/*主要就是这个,下面的都是样式*/ width: 6rem; hei ...
- Django进入监听端口就自动打开指定页面,无需导航栏手动添加(Django六)
在我们进入监听端口时画面如下:而因为在urls.py中写过如下语句 我们在监听端口后加上/login就会跳转到login.html页面,如下图 那么如何一打开监听端口就可以走动跳转到login.htm ...
- Git | Git入门,成为项目管理大师(一)
大家好,周一我们迎来了一个新的专题--git. 写这个专题的初衷有两点,第一点是觉得好像很少有公众号提到git相关的技术,可能是觉得太基础了看不上.但实际上git非常重要,在我们实际的开发工作当中使用 ...
- 关于弹性布局flex
什么时候使用flex布局? 当页面排版涉及左右浮动.垂直居中等时,应使用flex布局来避免传统的盒式布局带来的一些Bug. 如何使用flex布局? 在目标元素的父元素设置csss属性.display: ...
- Docker之简单操作
安装完Docker后,我们就可以与Docker进行交互来创建和管理容器等操作. 容器生命周期管理: 创建一个新的容器并运行一个命令 docker run [OPTIONS] IMAGE [COMMAN ...