mysqlslap的一个主要工作场景就是对数据库服务器做基准测试。
    测试方法
  1、测试工具:mysqlslap,mysqlslap是MySQL5.1.4之后自带的benchmark基准测试工具,该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。
  2、测试流程:建立测试数据库database和待测试的表tables → 根据table的结构,利用脚本生成一定数量的有效随机数据 → 利用mysqlslap对相应query语句进行测试 → 结果数据的分析。
  3、关键语句:考虑到资源平台的实际应用情况,通过资源属性查询资源的操作为主要操作,且这类操作的耗时占总操作耗时的比例为最大,故对应这类操作的查询语句为关键语句,对整个数据库性能影响很大,我们可以通过测试这个关键语句得出的结果来评估整个数据库的性能。
 

使用语法如下:
# mysqlslap [options]

常用参数 [options] 详细说明:

  • --auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具自己生成的SQL脚本来测试并发压力。
  • --auto-generate-sql-load-type=type 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括:read,key,write,update和mixed(默认)。
  • --auto-generate-sql-add-auto-increment 代表对生成的表自动添加auto_increment列,从5.1.18版本开始支持。
  • --number-char-cols=N, -x N 自动生成的测试表中包含多少个字符类型的列,默认1
  • --number-int-cols=N, -y N 自动生成的测试表中包含多少个数字类型的列,默认1
  • --number-of-queries=N 总的测试查询次数(并发客户数×每客户查询次数)
  • --query=name,-q 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
  • --create-schema 代表自定义的测试库名称,测试的schema,MySQL中schema也就是database。
  • --commint=N 多少条DML后提交一次。
  • --compress, -C 如果服务器和客户端支持都压缩,则压缩信息传递。
  • --concurrency=N, -c N 表示并发量,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者--delimiter参数指定的值做为分隔符。例如:--concurrency=100,200,500。
  • --engine=engine_name, -e engine_name 代表要测试的引擎,可以有多个,用分隔符隔开。例如:--engines=myisam,innodb。
  • --iterations=N, -i N 测试执行的迭代次数,代表要在不同并发环境下,各自运行测试多少次。
  • --only-print 只打印测试语句而不实际执行。
  • --detach=N 执行N条语句后断开重连。
  • --debug-info, -T 打印内存和CPU的相关信息。

更详细的参数请查阅官网文档:https://dev.mysql.com/doc/refman/5.7/en/mysqlslap.html#option_mysqlslap_debug-info

说明:
测试的过程需要生成测试表,插入测试数据,这个mysqlslap可以自动生成,默认生成一个mysqlslap的schema,如果已经存在则先删除。可以用--only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹。

 
  测试过程

mysqlslap的运行有如下3个步骤:

1. 创建schema、table、test data 等,使用单个连接 (在MySQL中,schema就是database);
        2. 运行负载测试,可以使用多个并发客户端连接;
        3. 测试环境清理(删除创建的数据、表等,断开连接),使用单个连接。

  1、建表:
  通过属性查询资源需要两张表:设备表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次。
  该语句的测试结果如下图所示:
  结果中可以看到执行语句的平均耗时,最大耗时和最小耗时,并发线程数等等。
 
  附录:
  生成测试数据的sql脚本:
   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)//

  实例  

单线程测试。测试做了什么。
# mysqlslap -a -uroot -p123456
多线程测试。使用–concurrency来模拟并发连接。
# mysqlslap -a -c 100 -uroot -p123456
迭代测试。用于需要多次执行测试得到平均值。
# mysqlslap -a -i 10 -uroot -p123456

# mysqlslap ---auto-generate-sql-add-autoincrement -a -uroot -p123456
# mysqlslap -a --auto-generate-sql-load-type=read -uroot -p123456
# mysqlslap -a --auto-generate-secondary-indexes=3 -uroot -p123456
# mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -p123456
# mysqlslap --create-schema world -q "select count(*) from City" -uroot -p123456
# mysqlslap -a -e innodb -uroot -p123456
# mysqlslap -a --number-of-queries=10 -uroot -p123456

测试同时不同的存储引擎的性能进行对比:
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -p123456

执行一次测试,分别50和100个并发,执行1000次总查询:
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -p123456

50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次:
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -p123456

mysqlslap工具测试mysql DB的性能的更多相关文章

  1. MySQL抓包工具:MySQL Sniffer 和性能优化

    简介 MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQLServer 端的请求,并格式化输出.输出内容包访问括时间.访问用户.来源 IP.访问 Database. ...

  2. mysqlslap详解--MySQL自带的性能压力测试工具(转)

    本文的参考博客地址为:https://blog.csdn.net/fuzhongfaya/article/details/80943991 和 https://www.cnblogs.com/davy ...

  3. 使用Jmeter测试MySQL性能——(1)连接配置

    在搭建MySQL集群之后需要测试集群的性能究竟如何,采用Apache的测试工具Jmeter进行测试,本文主要介绍主要实现Jmeter配置连接到MySQL. 安装相应的软件 首先Jmeter是基于Jav ...

  4. 使用Swoole测试MySQL在特定SQL下的并发性能

    场景描述 从全文检索或者缓存中获取ID,根据ID查询数据库获取基础信息,进行页面展示 SQL:select * from table where id in(id1,id2,id3...id40) 此 ...

  5. 微软的开源Sonar工具测试网站的性能和安全性

    Tips 原文作者:ABHIMANYU GHOSHAL 原文地址:Microsoft's open-source Sonar tool will test your site's performanc ...

  6. 有谁知道什么工具测试IOS手机上APP的性能软件啊?

    有谁知道什么工具测试IOS手机上APP的性能软件啊?

  7. python测试mysql写入性能完整实例

    这篇文章主要介绍了python测试mysql写入性能完整实例,具有一定借鉴价值,需要的朋友可以参考下 本文主要研究的是python测试mysql写入性能,分享了一则完整代码,具体介绍如下. 测试环境: ...

  8. 使用FIO工具测试块存储性能

    Linux实例和Windows实例都推荐使用FIO工具测试块存储性能.   说明 您也可以使用其他工具测试块存储性能,但不同工具测试出来的硬盘基准性能会有差异,如dd.sysbench.iometer ...

  9. mysqlslap 压力测试使用总结

    今天从运维同事那听说了mysql压力测试工具mysqlslap.经了解其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开 ...

随机推荐

  1. Spark运行模式_本地伪集群运行模式(单机模拟集群)

    这种运行模式,和Local[N]很像,不同的是,它会在单机启动多个进程来模拟集群下的分布式场景,而不像Local[N]这种多个线程只能在一个进程下委屈求全的共享资源.通常也是用来验证开发出来的应用程序 ...

  2. 链表--数据结构与算法JavaScript描述(6)

    链表 概念 链表是由一组节点组成的集合. 每个节点都使用一个对象的引用指向它的后继. 指向另一个节点的引用叫做 链. 许多链表的实现都在链表最前面有一个特殊节点,叫做头节点. 链表的尾元素指向一个nu ...

  3. 广州Uber优步司机奖励政策(1月4日~1月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  4. 接口测试工具postman(六)添加变量(参数化)

    1.添加全局变量并引用 2.通过设置请求前置配置变量 3.在Tests里面,把响应数据设置为变量 4.添加外部文件,引用外部文件中的变量和数据,此种场景就可以执行多次请求 1)配置文件,txt或者cs ...

  5. 【hidden】微信小程序hidden属性使用示例

    hidden属性用于隐藏标签,代码示例: <view hidden="{{!statusTag}}">我出来了~</view> <button bin ...

  6. JavaScript写的一个带AI的井字棋

    最近有一门课结束了,需要做一个井字棋的游戏,我用JavaScript写了一个.首先界面应该问题不大,用html稍微写一下就可以.主要是人机对弈时的ai算法,如何使电脑方聪明起来,是值得思考一下的.开始 ...

  7. 深入理解java虚拟机学习笔记(二)

    第三章 垃圾收集器与内存分配策略 概述 ​ 程序计数器.虚拟机栈.本地方法栈3个区随线程而生,随线程而灭.因此大体上可认为这几个区域的内存分配和回收都具备确定性.在方法/线程结束时,内存自然就跟着回收 ...

  8. [SHELL]linux环境变量

  9. 标注点(Labeled Point)

    标注点LabeledPoint是一种带有标签(Label/Response)的本地向量,它可以是稠密或者是稀疏的.在MLlib中,标注点在监督学习算法中被使用.由于标签是用双精度浮点型来存储的,故标注 ...

  10. MySql优化浅析

    优化点:合理的使用索引,可以大幅度提升sql查询效率,特别查询的表的数据量大的时候,效果明显.一.引言 公司的产品XX出行上线正式运营,随着数据量的变大,司机2000+,日订单1万+,注册乘客26W+ ...