垂直拆分,解决了单库容量过大的问题,但是对于单表记录过大的问题,并没有解决。
按照数据表中某个字段的某种规则,将记录分散到多个库中,每个库该表中存储一部分记录,所有库中该表的记录并集,为该表所有记录的数据全集。
可以将其理解为按照数据的行进行拆分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。
MySQL单表存储数据条数,是存在瓶颈的。当单表数据达到1000万条时就会到达性能瓶颈,对查询效率有明显影响。此时,需要对该表做水平拆分的优化。
以前边创建的 orders 表为例,可以根据不同的字段进行分表。
分表字段 | 效果 |
---|---|
id | 对于整个系统来说,所有订单都会被平衡地拆分到不同数据库中,但是结合使用场景,这个查询系统中所有订单的操作,没有实际价值,因为该项操作仅支持系统管理员操作 |
customer_id | 将用户的订单平衡地拆分到不同数据库中。用户在下完订单后,对订单进行查询,该项操作的查询会非常频繁,如果根据该字段进行拆分,将极大提高查询效率,提升用户体验 |
为数据表 orders 设置数据节点 dn1、dn2,并定义分片规则的名称为 customer_id_rule。
增加一个 table 节点:
在rule.xml配置文件中,增加名称为 customer_id_rule 的规则信息。
添加用于水平拆分的规则名称:
<tableRule name="customer_id_rule">
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
该节点是用于设置对数据存储分片的计算规则。
可以选择添加新的function节点,或者在确保对其他设置没有影响时,修改已有的function节点。
通过这种设置后,即我们有两台数据库节点,在存储数据时,先做 x % 2 运算,当值为0时存储 dn1,值为1时存储到 dn2。
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
因之前做分库时,仅将 orders 表保存到了 dn1 节点,这里需要在 dn2 节点中也创建 orders 表。
进入到 dn2 容器
docker exec -it db2 /bin/bash
进入到数据库命令行
mysql -uroot -p123456
创建 orders 表
create table orders(id int auto_increment primary key, order_type int, customer_id int, amount decimal(10,2));
mycat restart2.7 向orders表中批量插入数据
mysql -uroot -p123456 -h192.168.137.3 -P8066
批量插入数据
insert into orders(id, order_type, customer_id, amount) values(1, 101, 100, 258.12);
insert into orders(id, order_type, customer_id, amount) values(2, 101, 101, 1543.0);
insert into orders(id, order_type, customer_id, amount) values(3, 101, 101, 57.03);
insert into orders(id, order_type, customer_id, amount) values(4, 101, 100, 5000);
insert into orders(id, order_type, customer_id, amount) values(5, 101, 100, 923);
insert into orders(id, order_type, customer_id, amount) values(6, 101, 102, 7583);
所有插入的数据,根据 customer_id 在 dn1 和 dn2 节点进行了水平拆分。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。