有一类业务,例如订单(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分片的更多相关文章

  1. MyCAT ER分片的验证

    在这里,构造了两张表,熟悉Oracle的童鞋都知道,dept(部门表)和emp(员工表),其中dept中的deptno是emp表中dept_no的外键. 两表的建表语句如下: create table ...

  2. mycat ER 分片表

    <table name="order" dataNode="dn$1-32" rule="mod-long"> <chil ...

  3. MyCat 学习笔记 第十篇.数据分片 之 ER分片

    1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键 ...

  4. mycat读写分离+垂直切分+水平切分+er分片+全局表 测试

    原文http://blog.163.com/bigoceanwu@126/blog/static/172718064201683031639683/ 读写分离:利用最基础的mysql主从复制,事务性的 ...

  5. MyCat 枚举分片设计思考,查询命中条件

    Mycat多租户实现的两种方式 MyCat,各种分片规则,仅保证插入的时候分片.表关联,join,查询怎么命中分片条件,还是需要设计. 今天稍微测了一下. ER 分片,此方式,插入的时候能分片,但是查 ...

  6. Mycat跨分片Join

    1 前言 Mycat目前版本支持跨分片的join,主要实现的方式有四种. 全局表 ER分片 HBT(参考MyCAT人工智能解决跨分片SQL.docx) ShareJoin ShareJoin在开发版中 ...

  7. Mysql系列六:(Mycat分片路由原理、Mycat常用分片规则及对应源码介绍)

    一.Mycat分片路由原理 我们先来看下面的一个SQL在Mycat里面是如何执行的: , ); 有3个分片dn1,dn2,dn3, id=5000001这条数据在dn2上,id=10000001这条数 ...

  8. JAVAEE——宜立方商城13:Mycat数据库分片、主从复制、读写分离、100%Linux中成功安装Mysql的方法

    1 海量数据的存储问题 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个时候NoSQL ...

  9. JAVAEE——宜立方商城13:订单系统实现、订单生成、Mycat数据库分片

    1. 学习计划 1.订单系统实现 2.订单生成 3.Mycat数据库分片 2. 订单系统 2.1. 功能分析 1.在购物车页面点击“去结算”按钮,跳转到订单确认页面 a) 必须要求用户登录 b) 使用 ...

随机推荐

  1. 反射机制(Java)

    反射机制 今天闲来无事,对反射机制http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html阅读一番,整理了下这方面的知识以及自己的一些心得 ...

  2. vue <compent> 结合is实现动态切换子组件

    这里就很自然的产生一个新问题:如何给相应的子组件传props?

  3. zt:HttpUrlConnection使用详解

    下文转载自:https://www.cnblogs.com/tenWood/p/8563617.html 一,HttpURLconnection的介绍 在Android开发中网络请求是最常用的操作之一 ...

  4. 20190923-11Linux crond 系统定时任务 000 019

    crond 服务管理 1.重新启动crond服务 [root@hadoop101 ~]# service crond restart centOS7是 systemctl restart crond ...

  5. Odoo10.0中的工作流

    Odoo10.0中可以通过两种方式来实现工作流(workflow) 一种的官网API中给出的方式,链接:https://www.odoo.com/documentation/10.0/referenc ...

  6. jmeter压测以及用Badboy录脚本

    一.压测时的基本配置: 1.设置线程数.延迟几秒.循环次数打勾表示一直去循环.调度器打勾可以填写持续时间.启动时间等 线程数:就是并发的用户数   N Ramp-Up Period(in second ...

  7. Netty之旅三:Netty服务端启动源码分析,一梭子带走!

    Netty服务端启动流程源码分析 前记 哈喽,自从上篇<Netty之旅二:口口相传的高性能Netty到底是什么?>后,迟迟两周才开启今天的Netty源码系列.源码分析的第一篇文章,下一篇我 ...

  8. linux如何把普通用户添加到sudo组

    sudo原理:运行命令时,系统检查/etc/sudoers 配置文件,看这个用户是否有执行sudo的权限,如果有权限,系统要求输入用户自己的密码,如果密码输入正确,系统会以root身份运行 passw ...

  9. vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单

    一. 前言 本篇基于 有来商城 youlai-mall微服务项目,通过对vue-element-admin的权限菜单模块理解个性定制其后台接口,实现对vue-element-admin工程几乎不做改动 ...

  10. Java编程系列文章序言

    Java编程系列分为基础编程和高级编程两部分: 其中基础编程包括基础语法如变量和标识符,流程控制等,数组如一维数组二位数组等,及面向对象,异常处理: 高级部分多线程,常用类,注解,Java集合,泛型, ...