在实际工作中,经常有同事问道:MySQL Innodb表记录数多大是合适的?

一般的理解肯定是表越大性能越低,但具体低多少呢,是缓慢下降还是急剧下降,是1000万就下降还是1亿才下降呢?


针对这些问题,我做了一下基准测试,基准测试环境如下:

【硬件配置】

硬件

配置

CPU

Intel(R) Xeon(R) CPU E5620 主频2.40GHz, 物理CPU 2个,逻辑CPU 16个

内存

24G(6块 * 4G  DDR3 1333 REG)

硬盘

300G * 3个,SAS硬盘 15000转,无RAID,有RAID卡,且开了回写功能

OS

RHEL5

MySQL

5.1.49/5.1.54

【MySQL配置】

配置项

配置

innodb_buffer_pool_size

18G

innodb_log_file_size

200M

innodb_log_files_in_group

3

sync_binlog

100

innodb_flush_log_at_trx_commit

2

【表配置】


配置项

配置

记录数

1000万,2000万,5000万,1亿

存储引擎

Innodb

行格式

compact

性能测试结果如下:

1)同一张表,不同记录数,测试结果如下:


分析如下:

(1)当表大小小于Inndob buffer pool时,整体性能会随着表记录数的增加而略微降低,但各种操作的性能差别总体不大(例如1KW/2KW是12000TPS,5KW是10000TPS,相差16%)。

(2)当表大小大于Innodb buffer pool(10KW)时,性能急剧下降(从12000降到1000),性能接近高安全性配置的性能,因为此时磁盘IO成为了性能的主要影响因素。

因此,表记录数本身对性能影响不大,关键是表的大小是否小于Innodb buffer pool。


2)不同的表,不同的记录数

为了进一步验证表记录对性能的影响,还验证了另外一种情况:记录数很大但每条记录较短,和记录数较少但每条记录很长两种表对比。

主要对比了Value长度为10(以下简称Value10)和Value长度为250(以下简称Value250)的表的性能。由于Innodb只有在buffer pool大于表大小的时候性能才最高,因此测试对比时为了满足这个条件,Value10的表记录数是10KW,而Value250的表记录数是2KW。



从上图可以看出,即使Value10的表记录数是Value250的表记录数的5倍,但性能反而高出16%左右,由此可以看出,相比表记录数来说,行长度对性能影响更大,行越长性能越低。


【应用建议】

基于以上分析,对于表记录数需要考虑的是记录数的临界点,即:表达到这个记录数后,表大小(数据和索引)超过了Innodb buffer pool的大小;而设计时推荐尽量设计和试用行长度小而精的表。