mysql 性能测试工具 --mysqlslap

mysqlslap

近期的面试中,面试官提到了过往项目中的瓶颈在哪里。虽然mysql的性能并不是该项目的瓶颈。但是作为技术,mysql的性能测试并不了解,说来惭愧。回来整理了一下相关性能测试工具,以及简单的使用。

介绍

mysqlslap,mysqlslap是MySQL5.1.4之后自带的benchmark基准测试工具,该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。官方介绍:http://dev.mysql.com/doc/refman/5.6/en/mysqlslap.html
使用方法:http://my.oschina.net/moooofly/blog/152547

简单使用参数

想要看详细的信息可以 man mysqlslap 或者使用 mysqlslap –help 查看

–concurrency    并发数量,多个可以用逗号隔开
–engines       要测试的引擎,可以有多个,用分隔符隔开,如engines=myisam,innodb
–iterations      要运行这些测试多少次
–auto-generate-sql        用系统自己生成的SQL脚本来测试
–auto-generate-sql-load-type   要测试的是读还是写还是两者混合的(read,write,update,mixed)
–number-of-queries        总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算
–debug-info            额外输出CPU以及内存的相关信息
–number-int-cols          创建测试表的int型字段数量
–number-char-cols       创建测试表的chat型字段数量
–create-schema          测试的database
–query 自己的SQL         脚本执行测试
–only-print            如果只想打印看看SQL语句是什么,可以用这个选项

测试流程

  1. 建立测试数据库database和待测试的表tables
  2. 根据table的结构,利用脚本生成一定数量的有效随机数据
  3. 利用mysqlslap对相应query语句进行测试
  4. 结果数据的分析。

测试过程

、建表:
通过属性查询资源需要两张表:设备表device和设备属性对应表deviceattr。device表对应资源,记录资源的基本信息,如name,type,group,creator等等;deviceattr表对应资源和属性的关系,记录每个资源的每个属性和属性值;它们的结构如下所示:
这里写图片描述
这里写图片描述

通过多个属性组合查询deviceattr表,获得相应的id ,id即是满足条件的设备id,进而能直接在device表中查询得到其基本属性。

本次测试的关键语句即是从deviceattr表中组合查询出满足条件的id,故本测试只需要用到deviceattr一张表。

2、生成随机数据并插入相应的表中:
这里编写了几个生成随机数据的sql函数rand_name(),rand_value(),rand_num(),rand_creator(),并编写了存储过程insert_devattr,用来将一定量数据批量插入deviceattr表中。

然后将整个建表和存储数据的过程写进一个sql脚本中,并在mysql中运行这个脚本,待测试的表和数据就建立好了。(sql脚本在附录)如下图所示,生成的deviceattr随机数据有4020条:
这里写图片描述

3、利用mysqlslap进行测试:
整个数据库的关键操作为通过属性查询资源,该操作的关键sql语句就是:

select id from deviceattr where [ n attr ] group by id;

扫描二维码关注公众号,回复: 1613672 查看本文章

例:查询拥有attr10或者attr20属性的所有资源的id为:

select id from deviceattr where name = ‘attr10’ or name = ‘attr20’ group by id;

在建立好待测数据库后,就可以利用mysqlslap进行测试,mysqlslap命令如下所示:

shell < mysqlslap –create-schema=’test1’ –query=”select id from deviceattr where name=’attr10’ or name=’attr20’ group by id;” -c 50 -i 100

以上语句表示:使用test1数据库,使用query所指定的语句,测试50个并发查询,每一个查询100次。

这里写图片描述
使用的参数 -u 用户名 -p 密码 由于本人密码带有&等特殊字符 只能通过这种方式设置。
在本地执行看到的结果如上 这个sql 平均执行时间 最大最小执行时间都会列出来。

附录

mysql 执行的语句

use test1

drop table if exists device,attr,deviceattr;
drop function if exists rand_name;
drop function if exists rand_value;
drop function if exists rand_num;
drop function if exists rand_creator;
drop procedure if exists insert_devattr;
drop procedure if exists insert_dev;

create table device    
(
id int primary key,
name varchar(40),
type varchar(40),    
aquired int,
groupname varchar(40),
creator varchar(40)
);  


create table attr
(
id int primary key,
name varchar(40)
);


create table deviceattr
(
id int,
name varchar(40),
value varchar(40)
);

delimiter //

create function rand_creator()
returns varchar(20)
begin
declare return_str varchar(20) default 'aronhe';
declare n int default 0;
set n = floor(rand()*10);
case n
when 0 then set return_str = 'aronhe';
when 1 then set return_str = 'eeelin';
when 2 then set return_str = 'shadowyang';
when 3 then set return_str = 'luzhao';
when 4 then set return_str = 'tommyzhang';
when 5 then set return_str = 'pillarzou';
when 6 then set return_str = 'allenpan';
when 7 then set return_str = 'beyondli';
when 8 then set return_str = 'minshi';
when 9 then set return_str = 'bingchen';
else set return_str = 'joyhu';
end case;
return return_str;
end//

create function rand_num()
returns int
begin
declare n int default 0;
set n = floor(rand()*100);
return n;
end//

create function rand_value()
returns varchar(10)
begin
declare return_str varchar(10) default 'false';
declare n int default 0;
set n = floor(rand()*10);
case
when n<5 then set return_str = 'false';
when n>5 then set return_str = 'true';
else set return_str = 'true';
end case;
return return_str;
end//

create function rand_name()
returns varchar(20)
begin
declare return_str varchar(20) default '';
set return_str = concat('attr',floor(rand()*200));
return return_str;
end//

create procedure insert_devattr(in start int,in max int)
begin
declare i int default 0;
repeat
set i=i+1;
insert into deviceattr values(rand_num(),rand_name(),rand_value());
until i =max
end repeat;
end//

create procedure insert_dev(in start int,in max int)
begin
declare i int default 10;
repeat
set i=i+1;
insert into device values(i,concat('runner',floor(rand()*100)),'pc',floor(rand()*2),'PCQQ',rand_creator());
until i =max
end repeat;
end//

call insert_devattr(0,4000)//
call insert_dev(11,100)//

参考:https://cloud.tencent.com/developer/article/1004894

猜你喜欢

转载自blog.csdn.net/u012279631/article/details/80686633