- MySQL5.1地的确提供了好多有力的工具来帮助我们DBA进行数据库管理。
- 现在看一下这个压力测试工具mysqlslap
- 关于他的选项手册上以及--help介绍的很详细。
- 我解释一下一些常用的选项。
- --concurrency 并发量,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者–delimiter参数指定的值做为分隔符。
- --engines 代表要测试的引擎,可以有多个,用分隔符隔开。
- --iterations 代表要运行这些测试多少次。
- --auto-generate-sql 代表用系统自己生成的SQL脚本来测试。
- --auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的(read,write,update,mixed(默认))
- --number-of-queries 代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。比如倒数第二个结果2=200/100。
- --debug-info 代表要输出一些调试相关信息。
- --number-int-cols 自动生成的测试表中包含多少个数字类型的列,默认1。
- --number-char-cols 自动生成的测试表中包含多少个字符类型的列,默认1。
- --create-schema 测试的schema,MySQL中schema也就是database。
- --query 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
- --only-print 如果只想打印看看SQL语句是什么,可以用这个选项。
- –commint=N 多少条DML后提交一次。
- –compress, -C 如果服务器和客户端支持都压缩,则压缩信息传递。
- –detach=N 执行N条语句后断开重连。
- 现在来看一些我测试的例子。
- 1、用自带的SQL脚本来测试。
- MySQL版本为5.1.23
- [root@localhost ~]# mysqlslap --defaults-file=/usr/local/mysql-maria/my.cnf --concurrency=50,100,200 --iterations=1 --number-int-cols=4 --number-char-cols=35 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=200 --debug-info -uroot -p1 -S/tmp/mysql_3310.sock
- Benchmark
- Running for engine myisam
- Average number of seconds to run all queries: 0.063 seconds
- Minimum number of seconds to run all queries: 0.063 seconds
- Maximum number of seconds to run all queries: 0.063 second
- Number of clients running queries: 50
- Average number of queries per client: 4
- Benchmark
- Running for engine myisam
- Average number of seconds to run all queries: 0.070 seconds
- Minimum number of seconds to run all queries: 0.070 seconds
- Maximum number of seconds to run all queries: 0.070 seconds
- Number of clients running queries: 100
- Average number of queries per client: 2
- Benchmark
- Running for engine myisam
- Average number of seconds to run all queries: 0.092 seconds
- Minimum number of seconds to run all queries: 0.092 seconds
- Maximum number of seconds to run all queries: 0.092 seconds
- Number of clients running queries: 200
- Average number of queries per client:
- Benchmark
- Running for engine innodb
- Average number of seconds to run all queries: 0.115 seconds
- Minimum number of seconds to run all queries: 0.115 seconds
- Maximum number of seconds to run all queries: 0.115 seconds
- Number of clients running queries: 50
- Average number of queries per client: 4
- Benchmark
- Running for engine innodb
- Average number of seconds to run all queries: 0.134 seconds
- Minimum number of seconds to run all queries: 0.134 seconds
- Maximum number of seconds to run all queries: 0.134 seconds
- Number of clients running queries: 100
- Average number of queries per client: 2
- Benchmark
- Running for engine innodb
- Average number of seconds to run all queries: 0.192 seconds
- Minimum number of seconds to run all queries: 0.192 seconds
- Maximum number of seconds to run all queries: 0.192 seconds
- Number of clients running queries: 200
- Average number of queries per client: 1
- User time 0.06, System time 0.15
- Maximum resident set size 0, Integral resident set size 0
- Non-physical pagefaults 5803, Physical pagefaults 0, Swaps 0
- Blocks in 0 out 0, Messages in 0 out 0, Signals 0
- Voluntary context switches 8173, Involuntary context switches 528
- 我来解释一下结果的含义。
- 拿每个引擎最后一个Benchmark示例。
- 对于INNODB引擎,200个客户端同时运行这些SQL语句平均要花0.192秒。相应的MYISAM为0.092秒。
- 2、用我们自己定义的SQL 脚本来测试。
- 这些数据在另外一个MySQL实例上。版本为5.0.45
- 先看一下这两个表的相关数据。
- 1)、总记录数。
- mysql> select table_rows as rows from information_schema.tables where table_schema='t_girl' and table_name='article';
- +--------+
- | rows |
- +--------+
- | 296693 |
- +--------+
- 1 row in set (0.01 sec)
- mysql> select table_rows as rows from information_schema.tables where table_schema='t_girl' and table_name='category';
- +------+
- | rows |
- +------+
- | 113 |
- +------+
- 1 row in set (0.00 sec)
- 2)、总列数。
- mysql> select count(*) as column_total from information_schema.columns where table_schema = 't_girl' and table_name = 'article';
- +--------------+
- | column_total |
- +--------------+
- | 32 |
- +--------------+
- 1 row in set (0.01 sec)
- mysql> select count(*) as column_total from information_schema.columns where table_schema = 't_girl' and table_name = 'category';
- +--------------+
- | column_total |
- +--------------+
- | 9 |
- +--------------+
- 1 row in set (0.01 sec)
- 3)、调用的存储过程
- DELIMITER $$
- DROP PROCEDURE IF EXISTS `t_girl`.`sp_get_article`$$
- CREATE DEFINER=`root`@`%` PROCEDURE `sp_get_article`(IN f_category_id int,
- IN f_page_size int, IN f_page_no int
- )
- set @stmt = 'select a.* from article as a inner join ';
- set @stmt = concat(@stmt,'(select a.aid from article as a ');
- if f_category_id != 0 then
- set @stmt = concat(@stmt,' inner join (select cid from category where cid = ',f_category_id,' or parent_id = ',f_category_id,') as b on a.category_id = b.cid');
- end if;
- if f_page_size >0 && f_page_no > 0 then
- set @stmt = concat(@stmt,' limit ',(f_page_no-1)*f_page_size,',',f_page_size);
- end if;
- set @stmt = concat(@stmt,') as b on (a.aid = b.aid)');
- prepare s1 from @stmt;
- execute s1;
- deallocate prepare s1;
- set @stmt = NULL;
- END$$
- DELIMITER ;
- 4)、我们用mysqlslap来测试
- 以下得这个例子代表用mysqlslap来测试并发数为25,50,100的调用存储过程,并且总共调用5000次。
- [root@localhost ~]# mysqlslap --defaults-file=/usr/local/mysql-maria/my.cnf --concurrency=25,50,100 --iterations=1 --query='call t_girl.sp_get_article(2,10,1);' --number-of-queries=5000 --debug-info -uroot -p -S/tmp/mysql50.sock
- Enter password:
- Benchmark
- Average number of seconds to run all queries: 3.507 seconds
- Minimum number of seconds to run all queries: 3.507 seconds
- Maximum number of seconds to run all queries: 3.507 seconds
- Number of clients running queries: 25
- Average number of queries per client: 200
- 平均每个并发运行200个查询用了3.507秒。
- Benchmark
- Average number of seconds to run all queries: 3.742 seconds
- Minimum number of seconds to run all queries: 3.742 seconds
- Maximum number of seconds to run all queries: 3.742 seconds
- Number of clients running queries: 50
- Average number of queries per client: 100
- Benchmark
- Average number of seconds to run all queries: 3.697 seconds
- Minimum number of seconds to run all queries: 3.697 seconds
- Maximum number of seconds to run all queries: 3.697 seconds
- Number of clients running queries: 100
- Average number of queries per client: 50
- User time 0.87, System time 0.33
- Maximum resident set size 0, Integral resident set size 0
- Non-physical pagefaults 1877, Physical pagefaults 0, Swaps 0
- Blocks in 0 out 0, Messages in 0 out 0, Signals 0
- Voluntary context switches 27218, Involuntary context switches 3100
- 看一下SHOW PROCESSLIST 结果
- mysql> show processlist;
- +------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+
- |Id | User | Host | db | Command | Time | State |Info |
- +------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+
- …………
- |3177 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3178 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3179 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3181 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3180 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3182 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3183 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3187 | root | % | t_girl | Query | 0| removing tmp table | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3186 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3194 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3203 | root | % | t_girl | Query | 0| NULL | deallocate prepares1 |
- |3221 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3222 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3223 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3224 | root | % | t_girl | Query | 0| removing tmp table | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3225 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- |3226 | root | % | t_girl | Query | 0| NULL | select a.* from article as a inner join (selecta.aid from article as a inner join (select cid from |
- +------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+
- rows in set (0.00 sec)
- 上面的测试语句其实也可以这样写
- [root@localhost ~]# mysqlslap --defaults-file=/usr/local/mysql-maria/my.cnf --concurrency=25,50,100 --iterations=1 --create-schema='t_girl' --query='call sp_get_article(2,10,1);' --number-of-queries=5000 --debug-info -uroot -p -S/tmp/mysql50.sock
- 小总结一下。
- mysqlslap对于模拟多个用户同时对MySQL发起“进攻”提供了方便。同时详细的提供了“高负荷攻击MySQL”的详细数据报告。
- 而且如果你想对于多个引擎的性能。这个工具再好不过了。
MySQL压力测试
最新推荐文章于 2025-08-08 11:12:28 发布