在实际工作中,经常有同事问道: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 |
配置项 | 配置 |
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。
![](http://hi.csdn.net/attachment/201112/18/0_1324223614F9lM.gif)
从上图可以看出,即使Value10的表记录数是Value250的表记录数的5倍,但性能反而高出16%左右,由此可以看出,相比表记录数来说,行长度对性能影响更大,行越长性能越低。
【应用建议】
基于以上分析,对于表记录数需要考虑的是记录数的临界点,即:表达到这个记录数后,表大小(数据和索引)超过了Innodb buffer pool的大小;而设计时推荐尽量设计和试用行长度小而精的表。
注:
测试数据只为对比用,不代表一般情况下MySQL的性能就这么高,因为为了能够对比,测试时做了很多准备工作,测试操作也是比较特殊的