Mycat【Mycat分片技术(水平拆分-分表、ER表、全局表)】(五)-全面详解(学习总结---从入门到深化)

简介: Mycat【Mycat分片技术(水平拆分-分表、ER表、全局表)】(五)-全面详解(学习总结---从入门到深化)

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"

目录
相关文章
|
7月前
|
算法 数据库
Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)
Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)
123 0
|
7月前
|
SQL 关系型数据库 MySQL
Mycat【Mycat高级特性_搭建双主双从、Mycat分片技术_垂直拆分-分库 】(四)-全面详解(学习总结---从入门到深化)
Mycat【Mycat高级特性_搭建双主双从、Mycat分片技术_垂直拆分-分库 】(四)-全面详解(学习总结---从入门到深化)
107 0
|
7月前
|
运维 负载均衡 关系型数据库
Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)
Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)
156 0
|
关系型数据库 分布式数据库 数据库
07MyCat - 概念 - 逻辑表
07MyCat - 概念 - 逻辑表
37 0
|
SQL 算法 Java
自定义水平分库分表策略【hint分片】
自定义水平分库分表策略【hint分片】
|
SQL 中间件 关系型数据库
MyCat - 分片 - 垂直拆分 - 全局表配置 | 学习笔记
快速学习 MyCat - 分片 - 垂直拆分 - 全局表配置
MyCat - 分片 - 垂直拆分 - 全局表配置 | 学习笔记
|
存储 关系型数据库 MySQL
MyCat - 分片 - 水平拆分 - 概述及案例场景 | 学习笔记
快速学习 MyCat - 分片 - 水平拆分 - 概述及案例场景
MyCat - 分片 - 水平拆分 - 概述及案例场景 | 学习笔记
|
存储 关系型数据库 MySQL
MyCat - 分片 - 垂直拆分 - 概述及案例场景 | 学习笔记
快速学习 MyCat - 分片 - 垂直拆分 - 概述及案例场景
MyCat - 分片 - 垂直拆分 - 概述及案例场景 | 学习笔记
|
存储 算法 关系型数据库
MyCat - 分片 - 水平拆分 - 分片配置及测试 | 学习笔记
快速学习 MyCat - 分片 - 水平拆分 - 分片配置及测试
MyCat - 分片 - 水平拆分 - 分片配置及测试 | 学习笔记
|
SQL 存储 关系型数据库
MyCat - 分片 - 垂直拆分 - 测试 | 学习笔记
快速学习 MyCat - 分片 - 垂直拆分 - 测试
MyCat - 分片 - 垂直拆分 - 测试 | 学习笔记

相关实验场景

更多