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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 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
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
1379 0
|
存储 关系型数据库 MySQL
开源PolarDB- X|替换Opengemini时序数据场景下产品力校验
本文作者:黄周霖,数据库技术专家,就职于南京北路智控股份有限公司,负责数据库运维及大数据开发。
|
缓存 Ubuntu Linux
Docker Buildx 简介与安装指南
Docker Buildx 是一个强大的工具,提供了多架构构建、并行构建和高级缓存管理等功能。通过正确安装和配置 Buildx,可以显著提升 Docker 镜像的构建效率和灵活性。希望本文能帮助你更好地理解和使用 Docker Buildx,以提高开发和部署的效率。
7323 16
如何用deepseek快速做PPT
如何用DeepSeek快速自动制作PPT?只需1分钟!首先,打开DeepSeek输入需求,包括身份、目的和具体要求。复制生成的内容,然后在Kimi中选择“PPT助手”,粘贴内容并点击“一键生成PPT”,选择模板。等待生成后下载PPT。免费工具,专业质量,轻松让你的PPT脱颖而出!快来试试吧!
|
Java 测试技术 开发者
【亮剑】通过自定义注解实现Spring AOP,可以更灵活地控制方法拦截和增强
【4月更文挑战第30天】通过自定义注解实现Spring AOP,可以更灵活地控制方法拦截和增强。首先定义自定义注解,如`@MyCustomAnnotation`,然后创建切面类`MyCustomAspect`,使用`@Pointcut`和`@Before/@After`定义切点及通知。配置AOP代理,添加`@EnableAspectJAutoProxy`到配置类。最后,在需拦截的方法上应用自定义注解。遵循保持注解职责单一、选择合适保留策略等最佳实践,提高代码可重用性和可维护性。记得测试AOP逻辑。
654 1
|
Java 关系型数据库 MySQL
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
|
前端开发 JavaScript Java
Spring boot 本地图片不能加载(图片路径)的问题及解决方法
这篇文章讨论了Spring Boot应用程序中本地图片无法加载的问题,通常由图片路径不正确引起,并提供了使用正确的相对路径和Thymeleaf语法来解决这一问题的两种方法。
|
关系型数据库 MySQL Java
为了把MySQL分库分表:MyCAT学明白,我花了近一个月的时间!
MySQL分库分表:MyCAT-问题描述 随着数据库存储的内容越来越多,MySQL主从复制也开始无法存储更多的数据,此时就需要切割表,把一张过大的表切割后分别存储在不同的MySQL中,以便存储更多的内容,承载更多的用户。此阶段出现的典型问题如下: (1)随着互联网的发展,数据的量级也呈指数级增长,从GB到TB再到PB。对数据的各种操作也愈加困难,传统的关系数据库已经无法满足快速查询与插入数据的需求。如何使单表数据量存储更大?甚至期望单表数据量可以“无限扩大”。 (2)MySQL本身是不支持读写分离的,MySQL只支持主从数据复制,读写功能需要重新开发,。有没有一种办法可以不用一次次重写这部
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
765 11
|
Java 数据管理 关系型数据库
Spring Boot中实现多数据源配置
Spring Boot中实现多数据源配置