概述
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 |
+-----------+-------------------------------+
总结
单库多表的分片策略如上展示,那么怎么才能把多库单表和单库多表结合起来呢?
下面再尝试一下。
网友评论