随着项目的推广,数据量快速的增长,即使加了缓存,数据库还是会出现查询缓慢的现象。一般来说,我们会首先对慢 SQL 语句和索引进行优化,再考虑集群方案和读写分离,最后才是分区分表分库的相关方案。

1、分区

所谓分区,就是把一张表的数据分成多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。这主要是为了解决数据库单文件过大造成的文件 I/O 性能问题。分区的好处是,对于上层应用,本身还是一张表,代码无需做大的更改。

可以参考阿里云RDS团队博客的相关文章:

MySQL · 最佳实践 · 分区表基本类型》

2、分表

所谓分表,就是把一张表按一定的规则分解成多个具有独立存储空间的实体表,拆分后的每张表具有较小的宽度或数据量。分表方式一般分为水平分表、垂直分表和 MERGE 引擎分表。

2.1、水平分表

水平分表,是针对单表数据量太多,按照一定的方式,比如对用户ID取余数,拆分为 N 个表。

拆分后,单表数据量变小,但是对于代码层面的操作会变的复杂多了,操作时要先判断涉及的数据所在的表名。

2.2、垂直分表

垂直分表,是针对单表的字段数太多,按照字段来进行分割,拆分为 N 个表。

一般来说,这是我们设计数据表结构时就应该考虑好的,尽量避免单表字段太多。

2.3、MERGE 引擎分表

相对于上面两种方式,此方式的好处是在代码层面无需改动。但是,仅限于 MyISAM 存储引擎

就我们的系统而言,基于事务等特性的考虑,所有表都是 InnoDB 引擎,并且自 MySQL 5.5.5 开始,InnoDB 引擎已经成为 MySQL 的默认引擎。

因此,此方式不做过多说明,有想法的可以参考以下文章:

《使用 MERGE 存储引擎实现 MySQL 的分表机制》

3、分库

分库解决的主要是单库里面表数量太多的问题,最终的目的还是优化性能。这块不做介绍,具体可以求助 Google

不过想说的是,目前流行的微服务模式,推荐的不就是把整体的应用按业务模块拆分为多个独立的小应用嚒,每个小应用有自己独立的库和资源。这个自然也就不存在需要分库的问题。

标签:MySQL