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语句是什么,可以用这个选项
测试流程
- 建立测试数据库database和待测试的表tables
- 根据table的结构,利用脚本生成一定数量的有效随机数据
- 利用mysqlslap对相应query语句进行测试
- 结果数据的分析。
测试过程
、建表:
通过属性查询资源需要两张表:设备表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;
例:查询拥有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 'aronhe';
42declare n int default 0;
43set n = floor(rand()*10);
44case n
45when 0 then set return_str = 'aronhe';
46when 1 then set return_str = 'eeelin';
47when 2 then set return_str = 'shadowyang';
48when 3 then set return_str = 'luzhao';
49when 4 then set return_str = 'tommyzhang';
50when 5 then set return_str = 'pillarzou';
51when 6 then set return_str = 'allenpan';
52when 7 then set return_str = 'beyondli';
53when 8 then set return_str = 'minshi';
54when 9 then set return_str = 'bingchen';
55else set return_str = 'joyhu';
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 'false';
72declare n int default 0;
73set n = floor(rand()*10);
74case
75when n<5 then set return_str = 'false';
76when n>5 then set return_str = 'true';
77else set return_str = 'true';
78end case;
79return return_str;
80end//
81
82create function rand_name()
83returns varchar(20)
84begin
85declare return_str varchar(20) default '';
86set return_str = concat('attr',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('runner',floor(rand()*100)),'pc',floor(rand()*2),'PCQQ',rand_creator());
106until i =max
107end repeat;
108end//
109
110call insert_devattr(0,4000)//
111call insert_dev(11,100)//
112