Mycat分片技术_水平拆分-分表
前言
上面谈到垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题。
水平拆分
相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。
理解:
我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。
实现分表
1、 选择要拆分的表
MySQL 单表存储数据条数是有瓶颈的,单表达到 1000 万条数据就 达到了瓶颈,会影响查询效率,需要进行水平拆分(分表)进行优化。
2、分表字段
以 orders 表为例,可以根据不同自字段进行分表
3、 修改配置文件 schema.xml
为 orders 表设置数据节点为 dn1、dn2,并指定分片规则为 mod_rule(自定义的名字)
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table>
4、修改配置文件rule.xml
分片规则:
在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id, 还有选择分片算法 mod-long(对字段 求模运算),customer_id 对两个节点求模,根据结果分片.配置算法 mod-long 参数 count 为 2,两个节点。
<tableRule name="mod_rule"> <rule> <columns>customer_id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">2</property> </function>
5、 在数据节点dn2上建orders表
create table orders( id int auto_increment, order_type int, customer_id int, amount decimal(10,2), primary key(id) );
6、 重启Mycat,让配置生效
mycat restart
7、 访问Mycat实现分片
INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
实时学习反馈
1.Mycat技术中水平拆分主要解决___问题。
A 表字段多
B 表数据量大
C 兼容
D 并发
2.Mycat技术中水平拆分表时配置分片规则为取模时在_____配置文 件中修改。
A server.xml
B ehcache.xml
C rule.xml
D rule.xml
Mycat分片技术_ER表
分片 join
遇到问题: orders表分片了,那和他相关的orders_detail 表未分片, join联 查的时候, master1正常查询出结果, master2上由于没有 orders_detail 表,则报错, 最后聚合结果肯定也是错误的。
ER 表
将子表的存储位置依赖于主表,并且物理上紧邻存放因此彻底解决了JION的效率和性能问题,根据这一思路,提出了基于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。
修改配置文件schema.xml
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" > <childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" /> </table>
参数:
childTable:子表
Master2上没有订单详情表创建一下
create table orders_detail( id int auto_increment, order_id int, detail varchar(200), primary key(id) );
重启Mycat服务
mycat restart
Mycat服务添加数据
insert into orders_detail(detail, order_id) values('detail1',1); insert into orders_detail(detail, order_id) values('detail1',2); insert into orders_detail(detail, order_id) values('detail1',3); insert into orders_detail(detail, order_id) values('detail1',4); insert into orders_detail(detail, order_id) values('detail1',5);
测试数据
select a.*,b.detail from orders a join orders_detail b on a.id=b.order_id;
实时学习反馈
1.Mycat技术中ER表解决___问题。
A 表字段多
B 表数据量大
C JOIN的效率和性能问题
D 数据节点多
2. Mycat技术中通过___标签配置ER表父子关系。
A child
B Table
C dataNode
D childTable
Mycat分片技术_全局表
全局表描述
在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典 表具有以下几个特性:
变动不频繁
数据量总体变化不大
数据规模不大,很少有超过数十万条记录。
全局表特征
全局表的插入更新操作会实时在所有节点上执行,保持各个分片的数据一致。
全局表的查询操作,只从一个节点获取。
全局表可以和任何一个表进行 JOIN 操作。
注意: 将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据JOIN 的难题。通过全局表+基 于E-R 关系的分片策略,Mycat 可以满足 80%以上的企业应用 开发。
配置全局表
<!--全局表配置比较简单,不用写 Rule 规则,修改schema.xml,如下配置即可--> <table name="dict_order_type" dataNode="dn1,dn2" type="global"></table>
在dn2创建 dict_order_type 表
#订单类型字典表 create table dict_order_type( id int auto_increment, order_type varchar(200), primary key(id) );
重启Mycat
mycat restart
Mycat上添加数据
insert into dict_order_type(id,order_type)values(101,'type1'); insert into dict_order_type(id,order_type)values(102,'type2');
测试数据
select * from dict_order_type;
实时学习反馈
1.Mycat技术中全局表主要解决___问题。
A 表数据量大
B 表字段多
C 变动不频繁和数据量总体不大的数据
D 代码量庞大,系统臃肿
2. Mycat技术中如何设置全局表____。
A global
B rule="mod_url"
C dataNode="global"
D type="global"