基于Percona tpcc-mysql的衍生版本,增加了自增列主键,去掉外键等特性。
tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品,专用于MySQL基准测试。
它生成的测试表我认为有2个问题:
- 没有自增列作为主键。如果仅作为基准测试问题不大,但和我们实际生产中的设计模式可能有一定区别,相信大多数人还是习惯使用自增列作为主键的,如果你没这个习惯,那么可以忽略本文了;
- 使用外键。个人认为MySQL对外键支持并不是太好,并且一定程度上影响并发性能,因此建议取消外键,仅保留一般的索引。
主要原因在于InnoDB引擎的特性,因为以下几点:
- InnoDB是索引组织表,更进一步说,是聚集索引组织表;
- 索引组织表的特点是该表数据存储顺序和索引的逻辑顺序完全一致;
- InnoDB默认优先选择主键作为聚集索引,否则会选择第一个定义为NOT NULL的唯一索引,若也没有的话则选择InnoDB引擎内置的rowid作为聚集索引;
- 因此最好要有显式声明一个主键,而且该主键具备顺序特性,所以选择自增列作为主键最为合适;
- 如果没有自增列做主键,那么写入的数据有可能是在物理及逻辑上都是随机离散存储的,相对更容易导致行锁等待或者死锁的问题。
基于上面几点,才有了这个分支版本。 因为只是增加了一个没有业务用途的自增主键列,可以放心使用,正常情况下,不会影响tpcc压测结果的相对准确性。 我微调了下tpcc-mysql的源码,主要改动有下面几个地方: 1、所有表都加上自增列做主键; 2、取消外键,仅保留普通索引; 3、降低tpcc测试过程中的输出频率,避免刷屏; 4、修改了表结构初始化DDL脚本以及load.c文件;
利用该分支版本进行tpcc压力测试的结果表明,有自增列主键时,其TpmC相比没有自增列主键约提升了10%,还是比较可观的。
[yejr@imysql.com]# mysqladmin -S path/mysql.sock -u user -p passwd create tpcc
[yejr@imysql.com]# mysql -S path/mysql.sock -u user -p passwd -f tpcc < create_table-aidpk.sql
[yejr@imysql.com]# cd path/tpcc-mysql [yejr@imysql.com]# cd src [yejr@imysql.com]# make
编译完成后,会在上一级目录下生成 tpcc_load、tpcc_start这2个可执行文件。
usage: tpcc_load [server] [DB] [user] [pass] [warehouse]
根据各自的测试环境,调整 run_tpcc.sh 脚本里的相应参数,运行该脚本可进行自动化测试。
备注: 每轮执行完测试后,最好能至少重启一下mysqld实例,避免热点数据缓存在内存中,影响测试结果的准确性。 此外,最好还要清除一下操作系统的os cache,用下面的方法:
[yejr@imysql.com]# echo 3 > /proc/sys/vm/drop_caches
关于tpcc-mysql的详细用法,可参考文章: 1、TPCC-MySQL使用手册:http://imysql.com/2012/08/04/tpcc-for-mysql-manual.html
可以和percona官方分支版本进行对比测试,看看二者的TpmC结果相差多少。
有任何问题请联系我。
- 叶金荣
- Oracle MySQL ACE Director
- 国内最早的MySQL推广者之一
- 2006年创办首个MySQL中文网站 http://imysql.com
- 10余年MySQL经验,擅长MySQL性能优化、架构设计、故障排查