MySQL单表数据量达到多少需要分库分表?
阿里巴巴《Java 开发手册》提出单表行数超过500万行或者单表容量超过2GB,推荐进行分库分表。那么这个数据是如何得出来的,又跟什么因素有关呢?。
实际上,这个数值与单表行数和单表容量并没有直接的关系,真正的影响的一个重要因素其实是索引。因为,MySQL为了提高性能,会将表的索引装载到内存中。如果机器硬件配置够强悍,其索引能够完全加载至内存,自然不会有太大问题。但是当单表行数不断增加达到某个量级,索引也会随之增大,最后导致内存无法存储全部索引,那么SQL查询就会产生磁盘IO,我们知道磁盘的性能自然跟内存是无法比的,所以性能会出现明显的下降。
那么单纯增加内存提升硬件配置是否可以解决问题呢?
当然短期是可以解决一部分性能需求,但随着业务的增长,仍然会再次出现问题。所以我们还需要找机会进行表结构优化,在无法继续优化的时候,再考虑分库分表提高系统的性能。实际上就是将单表的大数据量拆分到多个表中,这样单表的数据量降下来了,系统整体的性能自然是优化了。
那么,我们是不是一开始就考虑分库分表更好呢?省得后期再进行重构?
答案当然是否定的。实际上,我们要结合实际需求,在项目一开始根据初期数据量和硬件配置进行综合考量来决定,如果预计三年内的数据量根本达不到这个级别,那么就没必要在创建表时就分库分表。而500万行或者单表容量2GB只是一个通常的划线,算是一个比较折中的数值,便于决策,实际执行过程中根据表结构设计的不同、代码逻辑的复杂度不同以及SQL语句的不同,可能在50w、100w、300w、500w、800w等等单表行数时出现性能问题,我们要根据情况不断进行优化重构。
系统是不断变化发展的,每个项目的需求也是不同的,不能一概而论,要结合实际需求情况和硬件配置进行综合考量。