相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,
每个表中 包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就
是将表中的某些行切分 到一个数据库,而另外的某些行又切分到其他的数据库中,如下图:
MySQL单表存储数据条数是有瓶颈的,单表达到 1000 万条数据就达到了瓶颈,会影响查询效率,需要进行水平拆分(分表)进行优化。
Mycat原理图如下 :
Mycat和Mysql环境搭建如前几篇文章。
主/从机IP如下说明:
192.168.1.111 主机 dn1
192.168.1.109 从机 dn2
具体分表操作有如下几个步骤:
一. 选择分表字段
以 orders 表(表结构语句如下面)为例,可以根据不同字段进行分表
(1)id(主键、或创建时间) 查询订单注重时效,历史订单被查询的次数少,如此分片会造成一个节点访问多,一个访问少,不平均。
(2)customer_id(客户 id) 根据客户 id 去分,两个节点访问平均,一个客户的所 有订单都在同一个节点。故此处选择它来分表。
二. 修改schema.xml配置文件
添加table语句(如下截图),将orders表挂载在两个节点(dn1,dn2)上
vim /usr/local/mycat/conf/schema.xml
<table name="orders" dataNode="dn1,dn2" rule="mod_rule"></table>
三. 修改分表规则---客户id(customer_id)取模
经过前面的分析,我们选择了客户id这个字段来作为分表字段。
在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id,选择分片算法 mod-long(对字段求模运算),customer_id 对2个节点(dn1,dn2)求模。
根据结果分片配置算法 mod-long 参数 count 为 2,即两个节点。
说明:mod-long(mycat自带的算法)
vim /usr/local/mycat/conf/rule.xml
把 mod-long函数算法的节点数修改为2个节点,因为这里我们只有两个节点(dn1,dn2)
rule修改部分的源文件内容:
<tableRule name="mod_rule"><rule><columns>customer_id</columns><algorithm>mod-long</algorithm></rule></tableRule>
四. 登录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 console
2. 登录mycat
mysql -u mycat -p -h 192.168.1.111 -P 8066
密码:123456
3. 通过mycat插入数据到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 * from orders;)
六. 分表操作结果分析
如下图所示,可以看出customer_id=100的数据通过取模操作,3条数据全部插入到了主机中(dn1)。
customer_id=101的通过取模操作,3条数据全部插入到了从机中(dn2)。
也就是说通过配置mycat中的rule.xml规则文件(这里选择的是对customer_id取模),将通过mycat插入的数据很好的分到了2个节点上的orders表中,从而达到了分表的目的,减轻了数据库的压力。