第107讲:Mycat实践指南:取模分片下的水平分表详解
文章目录
- 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表就能看到所有的数据