小工具      在线工具  汉语词典  css  js  c++  java

Mycat 水平拆分----分表

软件&&安装,Java,Linux 额外说明

收录于:43天前

与垂直拆分相比,水平拆分不会对表进行分类,而是按照某个领域的一定规则将其分散到多个库中。

每个表包含一部分数据。简单来说,我们可以将数据的水平切分理解为按照数据行进行切分,即

表中的某些行被拆分到一个数据库中,其他一些行被拆分到其他数据库中,如下所示:

MySQL单表存储数据数量存在瓶颈。当单表达到1000万条数据时,就达到了瓶颈,会影响查询效率,需要水平拆分(分表)进行优化。

Mycat示意图如下 :

Mycat和Mysql环境的搭建和之前的文章一样。

主从IP解释如下:

192.168.1.111 主机 dn1

192.168.1.109 从 dn2

具体分表操作有以下步骤:

1、选择子表字段

以orders表(表结构语句如下)为例,可以根据不同的字段进行分表。

(1)id(主键,或者创建时间) 查询订单注重时效性,历史订单查询的次数较少。这样的分片会导致一个节点访问量多,另一个节点访问量少,这是不均匀的。

(2)customer_id(客户id)是根据客户id来划分的。两个节点访问能力平均,客户的所有订单都在同一个节点上。因此,选择这里进行分表。

2.修改schema.xml配置文件

添加表语句(如下图所示)并将orders表挂载到两个节点(dn1、dn2)上

vim /usr/local/mycat/conf/schema.xml

<table name="orders" dataNode="dn1,dn2"rule="mod_rule"></table>

3.修改分表规则---客户id(customer_id)取模

经过前面的分析,我们选择客户ID字段作为子表字段。

在规则配置文件中添加新的分片规则mod_rule,并指定该规则适用的字段为customer_id。选择分片算法 mod-long(对字段取模运算),以及 customer_id 对 2 节点(dn1、dn2)取模。

根据结果​​分片配置算法mod-long参数个数为2,即两个节点。

说明:mod-long(mycat自己的算法)

vim /usr/local/mycat/conf/rule.xml

修改mod-long函数算法的节点数为2个节点,因为这里我们只有两个节点(dn1,dn2)

规则修改部分的源文件内容:

 <tableRule name="mod_rule">
    <rule>
      <columns>customer_id</columns>
      <algorithm>mod-long</algorithm>
    </rule>
 </tableRule>

4、登录dn2上的mysql,创建orders表

在上一节的垂直分库中,我已经在dn1上创建了orders表。这里不需要在dn1上创建另一个表。

登录mysql:cd /usr/local/mysql/bin

./mysql -u root -p

创建订单表的语句如下:

CREATE TABLE orders(

    id INT AUTO_INCREMENT,

    order_type INT,

    customer_id INT,

    amount DECIMAL(10,2),

    PRIMARY KEY(id)

);

五。访问 Mycat 实现分片

1.重启Mycat使配置生效

cd /usr/local/mycat/bin

./mycat 控制台

2.登录mycat

mysql -u mycat -p -h 192.168.1.111 -P 8066

密码:123456

3. 通过我的猫插入数据到orders表中

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);

4、通过mycat查询我们刚刚插入的6条数据(select * fromorders;)

6、分表操作结果分析

如下图所示,可以看到customer_id=100的数据通过取模运算插入到主机(dn1)中。

通过customer_id=101的取模运算,将三条数据全部插入到从机(dn2)中。

也就是说,通过在mycat中配置rule.xml规则文件(这里选择customer_id的模),将通过mycat插入的数据很好地划分到两个节点上的orders表中,从而达到分表的目的。目的是减轻数据库的压力。

. . .

相关推荐

额外说明

SpringCloud阿里巴巴-nacos集群设置

文章目录 往期回顾 测试环境 nacos集群配置 增加cluster.conf配置文件 增加数据库配置 修改启动脚本 启动服务进行测试 编写客户端进行服务注册 往期回顾 之前在专栏中,针对nacos的集群配置,有通过nginx设置VIP(虚拟IP)和服务

额外说明

mysql什么情况下不使用索引?

  1 联合索引IDX(字段A,字段B,字段C,字段D),当仅使用字段A查询时,索引IDX就会使用到;如果仅使用字段B或字段C或字段D查询,则索引IDX都不会用到。     like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不

额外说明

Android中调用WebService服务的主要步骤

首先引入ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 此处附上链接两个版本的: 1.ksoap2-android-assembly-2.5.4-jar-with-dependencies.

额外说明

leetcode109(有序链表转换为二叉搜索树)

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 题解(一):将有序链表转换为二叉搜索树,其实就是将有序链表不断进行二分法二分的过程,其中

额外说明

【JAVA-Day19】深入探讨 Java 泛型和枚举的精髓

深入探讨 Java 泛型和枚举的精髓 深入探讨 Java 泛型和枚举的精髓 摘要 引言 一、Java 泛型 二、Java 枚举 三、泛型和枚举的区别和使用场景 区别 泛型和枚举的使用场景 泛型的使用场景 枚举的使用场景 四、总结 参考资料 博主 默语带您

额外说明

数据链路层

数据链路和帧: 链路:从一个节点到相邻节点的一段物理线路 数据链路:加上了通信协议来控制传输(早期的通信协议曾叫做规程) 帧(数据链路层的单位): 把网络层叫下来的数据构成帧发送到链路上 三个基本问题: 封装成帧: 在一段数据前后添加首部和尾部

额外说明

C语言 结构体与函数的区别,以及typedef的使用;

结构体与函数的区别: 结构体在定义时和函数不大一样;必须在 ”{ }“之后加 ";"    typedef :给变量类型起别名,例: typedef struct Xiaojj {  }Stu,*pp;      //Stu,*pp 都是结构体变量的别名

额外说明

ROS从入门到精通1-1:ROS核心架构、常用指令与计算图

目录 0 专栏介绍 1 ROS核心架构 1.1 工作空间 1.2 功能包 2 ROS常用指令 2.1 ROS-bash相关 2.2 ROS-通信相关 2.3 catkin编译系统相关 3 ROS动态计算图rqt 0 专栏介绍 本专栏旨在通过对ROS的系统

额外说明

【嵌入式系统】DMA工作原理与常用函数解析

【嵌入式系统】DMA工作原理与常用函数解析 1、DMA基本原理 直接存储器访问通道(DMA, Direct Memory Access)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。CPU只需初始化DMA,传输本身由DMA控制器来实现而

额外说明

FeignClient【问题】Cannot deserialize value of type``from Object value (token `JsonToken.START_OBJECT`)

1. 问题描述 @FeignClient(name = "dataServiceQueryInterface", url = "${url}:${port}") public interface DataServiceQueryInterface {

ads via 小工具