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"

目录
相关文章
|
SQL 关系型数据库 MySQL
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
1587 0
|
算法 数据库
Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)
Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)
213 0
|
SQL 关系型数据库 MySQL
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
1127 0
|
SQL 存储 关系型数据库
MySQL主从复制之原理&一主一从部署流程—2023.04
MySQL主从复制之原理&一主一从部署流程—2023.04
1544 0
|
SQL 存储 人工智能
MyCat-架构剖析-核心技术之跨库 join 实现 | 学习笔记
快速学习 MyCat-架构剖析-核心技术之跨库 join 实现
MyCat-架构剖析-核心技术之跨库 join 实现 | 学习笔记
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
8月前
|
Java 关系型数据库 MySQL
MySQL 分库分表方案
本文总结了数据库分库分表的相关概念和实践,针对单张表数据量过大及增长迅速的问题,介绍了垂直和水平切分的方式及其适用场景。文章分析了分库分表后可能面临的事务支持、多库结果集合并、跨库join等问题,并列举了几种常见的开源分库分表中间件。最后强调了不建议水平分库分表的原因,帮助读者在规划时规避潜在问题。
952 20
|
运维 负载均衡 关系型数据库
Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)
Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)
300 0
|
算法 关系型数据库 MySQL
十五张图带你快速入门 shardingsphere-proxy
Apache ShardingSphere 是一款分布式的数据库生态系统,它包含两大产品: - ShardingSphere-Proxy - ShardingSphere-JDBC 很多同学对于 ShardingSphere-JDBC 已经能非常熟悉的使用了,但关于网上关于 ShardingSphere-Proxy 5.5 的使用教程却非常少。
十五张图带你快速入门 shardingsphere-proxy
|
11月前
|
安全 Windows
Windows系统实现exe服务注册的方法都有哪些?
【10月更文挑战第5天】Windows系统实现exe服务注册的方法都有哪些?
1446 0