MySQL Benchmark Suite是除了“mysqlslap”命令行工具(http://blog.csdn.net/sweeper_freedoman/article/details/73556910)以外,MySQL安装自带的另一套功能更加强大的基准测试套件(https://dev.mysql.com/doc/refman/5.6/en/mysql-benchmarks.html)。不过5.7版本已经拿掉了,学习用就只能参考5.6版本的文档,在我本地Ubuntu Linux安装的是最新版本的MySQL,所以也只能下载一个5.6的源码包,然后把该组件单独移进去,其目录为“sql-bench”(https://dev.mysql.com/doc/internals/en/sql-bench-directory.html)。MySQL基准测试套件是用Perl语言写的,所以要运行它还得额外安装一些Perl支持(https://dev.mysql.com/doc/refman/5.6/en/perl-installation.html)。进入sql-bench目录,主要看到的是一些Shell脚本,其用来调用Perl程序进行基准测试任务。
如果MySQL安装没有该套件,如现在的新版本,首先是获取一套组件,移入自己的MySQL安装目录。
wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.36.tar.gz tar -xz -f mysql-5.6.36.tar.gz cp -rf mysql-5.6.36/sql-bench/ /usr/share/mysql/sql-bench/ cd /usr/share/mysql/sql-bench/ ; ls
安装Perl支持,如果系统没有安装Perl需要先安装Perl再执行(Ubuntu应该是自带的)。
perl -MCPAN -e shell /× 然后回车即可 ×/ install DBI install DBD::mysql
执行一个INSERT测试小栗子吧,好像都是很费时间的,尤其是全测。可以先看看目录下的README文件,介绍了使用方法。
perl test-insert.sh --server=mysql --user=root --password=520 --database=benchmarker --log --fast
竟然报错了,一脸懵逼啊。
Can't locate /usr/share/mysql/sql-bench/bench-init.pl in @INC …… ……
Can't locate /usr/share/mysql/sql-bench/server-cfg in @INC …… ……
vim test-insert.sh,去文件看看报错那些行写了什么,一脸懵逼,好像是文件名问题,改一下试试看。
cp bench-init.pl.sh bench-init.pl cp server-cfg.sh server-cfg
改完以后竟然好了,开始进行基准测试任务了。我的神船笔记本的风扇开始嗡嗡叫了,也不断有打印信息出来。
- --database选项指定进行测试的schema,老版本默认是test自带库,新版本的MySQL安装已经移除了该库,因此需要指定一个。
- --log用于监控测试进度。
- --fast允许测试使用非标准SQL以加快测试。
这个时候可以去睡觉或者做其他事情了。测试结果比较长和详细,但输出格式基本上是一致的,这里就截取本次实例的前一部分说明一下了。
Testing server 'MySQL 5.7.18 0ubuntu0.16.04.1' at 2017-06-22 5:50:11
Testing the speed of inserting data into 1 table and do some selects on it.
The tests are done with a table that has 100000 rows.
Generating random keys
Creating tables
Inserting 100000 multiple-value rows in order
Inserting 100000 multiple-value rows in reverse order
Inserting 100000 multiple-value rows in random order
Time for insert (300000): 11 wallclock secs ( 0.32 usr 0.04 sys + 0.00 cusr 0.00 csys = 0.36 CPU)
Time for book-keeping (1): 12 wallclock secs ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
Testing insert of duplicates
Time for insert_duplicates (100000): 11 wallclock secs ( 0.62 usr 1.75 sys + 0.00 cusr 0.00 csys = 2.37 CPU)
Test of prepared+execute/once prepared many execute selects
Time for prepared_select (100000): 19 wallclock secs ( 0.48 usr 5.35 sys + 0.00 cusr 0.00 csys = 5.83 CPU)
Time for once_prepared_select (100000): 14 wallclock secs ( 0.81 usr 2.25 sys + 0.00 cusr 0.00 csys = 3.06 CPU)
Retrieving data from the table
第一行输出的是当前测试MySQL服务器版本和测试时间。二三行是对本次测试job的说明,即对1张10w行数据的表读写速度的测试,该表是基准测试时自己创建的,测试期间可以去自己指定的测试库中看到这张表(`benchmark×`),也可以监控processlist看看测试在搞什么鬼。接下来几行就是该表的创建说明,可以看到10w行数据分别用了顺序写、倒序写和随机写三种方式进行了插入测试。
插入这30w行数据一共用了11秒,其中包含执行测试脚本的0.36秒额外消耗(usr、sys、cusr、csys),所以MySQL的实际性能应该是11 - 0.36 = 10.64秒。后面的输出基本上维持这种格式,是一些更细项目的测试结果。MySQL Benchmark Suit的功能覆盖纯数据库层级的各种工作场景,连接访问、DDL、DML、DQL、事务、大数据表格以及数据库整体运行等,可以作为数据库应用基准测试的选择。