第107讲:Mycat实践指南:取模分片下的水平分表详解

小明 2025-05-05 00:39:29 7

文章目录

    • 1.使用取模分片水平分表
    • 2.水平分表取模分片案例
      • 2.1.准备测试的表结构
      • 2.2.配置Mycat实现范围分片的水平分表
        • 2.2.1.配置Schema配置文件
        • 2.2.2.配置Rule分片规则配置文件
        • 2.2.3.配置Server配置文件
        • 2.2.4.重启Mycat
        • 2.3.写入���据观察水平分表效果

          1.使用取模分片水平分表

          平台库下有一张表的数据量非常多,目前已经达到了600w行数据,查询效率很低,数据量越大,索引的结构就越高,性能会有所下降。

          基于这种情况,我们决定针对这张业务表进行水平分表,分表后,原表的数据量就会被分到多张表中,缓解单表的压力,将该表的数据拆分到多个数据库实例中存放。

          本次我们通过取模分片的方式来对达标进行水平分表。

          取模分片指的是根据特定的字段值与分片节点数量进行求模运算,也就是除法运算取余数,根据运算结果中的余数,决定数据写入到哪一个分片中。指定取模分片的字段一定要是数字类型的字段,否则是无法进行运算的。

          取模分片例子:

          根据id列进行取模分片,写入数据的id为15,分片节点数为2个,运算过程:15/2=7余1,余数为1,取模分片此时就会将这个数据写入到分片2中,因为在Mycat分片中,分片的ID都是从0开始的,余数的值就是要写入对应分片节点的ID号,余数为1就对应分片2这个节点。

          2.水平分表取模分片案例

          在db_1数据库下有一张table1表,其数据量已经达到500w行,查询效率较低,现需要对这张表进行水平分表,采用取模分片的方法对该表进行水平分表。

          2.1.准备测试的表结构

          配置水平分表前,需要将要分的表在所有的分片上创建出来。

          分片节点数依旧是2个,还是之前垂直分库分表时使用的两套双主双从集群。

          1.在两个分片上创建数据库
          [root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11 -e "create database db_2;"
          [root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11 -e "create database db_2;"
          2.在两个分片上创建表结构
          [root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11 -e "use db_2; create table table2 (id int,name varchar(10));"
          [root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11 -e "use db_2; create table table2 (id int,name varchar(10));"
          

          2.2.配置Mycat实现范围分片的水平分表

          2.2.1.配置Schema配置文件

          我们针对table1这张表进行水平分表时,要为其同时指定上两个分片,然后再为其指定分片规则,同时指定两个分片后,Mycat根据分片规则路由到不同的分片上。

          [root@mysql-1 ~]# vim /data/mycat/conf/schema.xml
          
            
          
                   
                  
                      
                  	
          select user() select user()
          2.2.2.配置Rule分片规则配置文件

          在Rule分片规则配置文件中,我们要配置主要是根据表中的那个字段进行范围分片,如果做取模分片的字段也是id字段,就不需要调整这个配置文件,只需要调整取模分片中传入的参数。

          注意:做取模分片的字段必须是数字类型的字段。

          [root@mysql-1 ~]# vim /data/mycat/conf/rule.xml 
          	>
              
                  
                      
                      id	
                      mod-long
                  
              
              >
              
                  
                  2
              
          
          2.2.3.配置Server配置文件
          [root@mysql-1 ~]# vim /data/mycat/conf/server.xml
              
                  
                  123456
                  
                  db_2
              
          
          2.2.4.重启Mycat
          [root@mysql-1 ~]# mycat restart
          Stopping Mycat-server...
          Stopped Mycat-server.
          Starting Mycat-server...
          

          2.3.写入数据观察水平分表效果

          1)插入ID为10和15的两条数据

          [root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
          mysql> use db_2;
          mysql> insert into table2 (id,name) values (10,'abc');
          mysql> insert into table2 (id,name) values (15,'xbz');
          

          ID10除与分片节点数2,余数为0,那么该条数据会分配至分片1的数据库实例中。

          ID15除与分片节点数1,余数为1,那么该条数据会分配至分片2的数据库实例中。

          3)在Mycat中通过查询table1表就能看到所有的数据

The End
微信