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表对应资源和属性的关系,记录每个资源的每个属性和属性值;它们的结构如下所示:
mysql 性能测试工具 --mysqlslap
mysql 性能测试工具 --mysqlslap

通过多个属性组合查询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条:
mysql 性能测试工具 --mysqlslap

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

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

例:查询拥有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 执行的语句


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
1use test1
2
3drop table if exists device,attr,deviceattr;
4drop function if exists rand_name;
5drop function if exists rand_value;
6drop function if exists rand_num;
7drop function if exists rand_creator;
8drop procedure if exists insert_devattr;
9drop procedure if exists insert_dev;
10
11create table device    
12(
13id int primary key,
14name varchar(40),
15type varchar(40),    
16aquired int,
17groupname varchar(40),
18creator varchar(40)
19);  
20
21
22create table attr
23(
24id int primary key,
25name varchar(40)
26);
27
28
29create table deviceattr
30(
31id int,
32name varchar(40),
33value varchar(40)
34);
35
36delimiter //
37
38create function rand_creator()
39returns varchar(20)
40begin
41declare return_str varchar(20) default &#x27;aronhe&#x27;;
42declare n int default 0;
43set n = floor(rand()*10);
44case n
45when 0 then set return_str = &#x27;aronhe&#x27;;
46when 1 then set return_str = &#x27;eeelin&#x27;;
47when 2 then set return_str = &#x27;shadowyang&#x27;;
48when 3 then set return_str = &#x27;luzhao&#x27;;
49when 4 then set return_str = &#x27;tommyzhang&#x27;;
50when 5 then set return_str = &#x27;pillarzou&#x27;;
51when 6 then set return_str = &#x27;allenpan&#x27;;
52when 7 then set return_str = &#x27;beyondli&#x27;;
53when 8 then set return_str = &#x27;minshi&#x27;;
54when 9 then set return_str = &#x27;bingchen&#x27;;
55else set return_str = &#x27;joyhu&#x27;;
56end case;
57return return_str;
58end//
59
60create function rand_num()
61returns int
62begin
63declare n int default 0;
64set n = floor(rand()*100);
65return n;
66end//
67
68create function rand_value()
69returns varchar(10)
70begin
71declare return_str varchar(10) default &#x27;false&#x27;;
72declare n int default 0;
73set n = floor(rand()*10);
74case
75when n&lt;5 then set return_str = &#x27;false&#x27;;
76when n&gt;5 then set return_str = &#x27;true&#x27;;
77else set return_str = &#x27;true&#x27;;
78end case;
79return return_str;
80end//
81
82create function rand_name()
83returns varchar(20)
84begin
85declare return_str varchar(20) default &#x27;&#x27;;
86set return_str = concat(&#x27;attr&#x27;,floor(rand()*200));
87return return_str;
88end//
89
90create procedure insert_devattr(in start int,in max int)
91begin
92declare i int default 0;
93repeat
94set i=i+1;
95insert into deviceattr values(rand_num(),rand_name(),rand_value());
96until i =max
97end repeat;
98end//
99
100create procedure insert_dev(in start int,in max int)
101begin
102declare i int default 10;
103repeat
104set i=i+1;
105insert into device values(i,concat(&#x27;runner&#x27;,floor(rand()*100)),&#x27;pc&#x27;,floor(rand()*2),&#x27;PCQQ&#x27;,rand_creator());
106until i =max
107end repeat;
108end//
109
110call insert_devattr(0,4000)//
111call insert_dev(11,100)//
112

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

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索