随着项目的推广,数据量快速的增长,即使加了缓存,数据库还是会出现查询缓慢的现象。一般来说,我们会首先对慢 SQL
语句和索引进行优化,再考虑集群方案和读写分离,最后才是分区分表分库的相关方案。
1、分区
所谓分区,就是把一张表的数据分成多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。这主要是为了解决数据库单文件过大造成的文件 I/O
性能问题。分区的好处是,对于上层应用,本身还是一张表,代码无需做大的更改。
可以参考阿里云RDS团队博客的相关文章:
2、分表
所谓分表,就是把一张表按一定的规则分解成多个具有独立存储空间的实体表,拆分后的每张表具有较小的宽度或数据量。分表方式一般分为水平分表、垂直分表和 MERGE
引擎分表。
2.1、水平分表
水平分表,是针对单表数据量太多,按照一定的方式,比如对用户ID取余数,拆分为 N
个表。
拆分后,单表数据量变小,但是对于代码层面的操作会变的复杂多了,操作时要先判断涉及的数据所在的表名。
2.2、垂直分表
垂直分表,是针对单表的字段数太多,按照字段来进行分割,拆分为 N
个表。
一般来说,这是我们设计数据表结构时就应该考虑好的,尽量避免单表字段太多。
2.3、MERGE
引擎分表
相对于上面两种方式,此方式的好处是在代码层面无需改动。但是,仅限于 MyISAM
存储引擎。
就我们的系统而言,基于事务等特性的考虑,所有表都是 InnoDB
引擎,并且自 MySQL 5.5.5
开始,InnoDB
引擎已经成为 MySQL
的默认引擎。
因此,此方式不做过多说明,有想法的可以参考以下文章:
3、分库
分库解决的主要是单库里面表数量太多的问题,最终的目的还是优化性能。这块不做介绍,具体可以求助 Google
。
不过想说的是,目前流行的微服务模式,推荐的不就是把整体的应用按业务模块拆分为多个独立的小应用嚒,每个小应用有自己独立的库和资源。这个自然也就不存在需要分库的问题。