美文网首页
mycat 分库分表之单库多表策略

mycat 分库分表之单库多表策略

作者: sknfie | 来源:发表于2020-12-18 16:40 被阅读0次

概述

Mycat是基于阿里Cobar演变而来的一款开源分布式数据库中间件,是一个实现了MySQL协议的Server。
分库分表就是将原本存储于单个数据库上的数据拆分到多个数据库,把原来存储在单张数据表的数据拆分到多张数据表中,实现数据切分,从而提升数据库操作性能。
根据业务的实际需要,基于 MyCAT 的分布式数据存储方案提供两种分片策略:垂直分片和水平分片。

垂直分片(分库)

一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类, 分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面, 如何划分表分库的原则: 有紧密关联关系的表应该在一个库里,相互没有关联关系的表可以分到不同的库里。
> 一般情况下,微服务架构的方式比较合适采用垂直分片的方式。

水平分片(分表)

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中, 每个表中包 含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分 到一个数据库,而另外的某些行又切分到其他的数据库中. 实现分表选择要拆分的表 MySQL 单表存储数据条数是有瓶颈的,单表达到 1000 万条数据就达到了瓶颈,会影响查询效率, 需要进行水平拆分(分表) 进行优化。 例如:例子中的 orders、 orders_detail 都已经达到 600 万行数据,需要进行分表优化。 分表字段 以 orders 表为例,可以根据不同自字段进行分表。

单库分片实践

1.创建表

CREATE TABLE `city1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `country` varchar(50),
  `name` varchar(50),
  `state` varchar(50),
  PRIMARY KEY (`id`)
);

CREATE TABLE `city2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `country` varchar(50),
  `name` varchar(50),
  `state` varchar(50),
  PRIMARY KEY (`id`)
);

CREATE TABLE `city3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `country` varchar(50),
  `name` varchar(50),
  `state` varchar(50),
  PRIMARY KEY (`id`)
);

2.配置

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <table name="city" primaryKey="id" autoIncrement="true" subTables="city$1-3" dataNode="node1" rule="rule1" />
</schema>

<dataNode name="node1" dataHost="host1" database="db1" />

<!-- 物理机的 url -->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
    <heartbeat>select user()</heartbeat>
    <writeHost host="server1" url="192.168.201.33:3306" user="root" password="123456"/>
</dataHost>

3.验证

  • 插入数据
insert into city(id, country, name, state) VALUES (1, '中国', '长沙','湖南');
insert into city(id, country, name, state) VALUES (2, '中国', '长沙','湖南');
insert into city(id, country, name, state) VALUES (3, '中国', '长沙','湖南');
  • 查询数据
MySQL [TESTDB]> select * from city;
+----+---------+------+-------+
| id | country | name | state |
+----+---------+------+-------+
|  3 | ??      | ??   | ??    |
|  1 | ??      | ??   | ??    |
|  2 | ??      | ??   | ??    |
+----+---------+------+-------+

MySQL [TESTDB]> explain select * from city;
+-----------+-------------------------------+
| DATA_NODE | SQL                           |
+-----------+-------------------------------+
| node1     | SELECT * FROM city1 LIMIT 100 |
| node1     | SELECT * FROM city2 LIMIT 100 |
| node1     | SELECT * FROM city3 LIMIT 100 |
+-----------+-------------------------------+

总结

单库多表的分片策略如上展示,那么怎么才能把多库单表和单库多表结合起来呢?
下面再尝试一下。

相关文章

网友评论

      本文标题:mycat 分库分表之单库多表策略

      本文链接:https://www.haomeiwen.com/subject/wrjzgktx.html