背景

  由于一些不可描述的原因,我要确定一条业务SQL在给定的MySQL环境下的执行效率;比如说200个session同时跑同样一条SQL

  我们数据库的吞吐量怎么样?

  刚收到这个需求的时候,感觉这个要自己写一个程序才行了,还好身边有个老司机;他推荐用mysqlslap解决,所以也就有了这次

  对mysqlslap的学习。

mysqlslap介绍

  mysqlslap可以模拟若干个并发的MySQL客户端,来给MySQL做压力测试;官方文档中对mysqlslap的介绍非常的短(只有一页)

  https://dev.mysql.com/doc/refman/8.0/en/mysqlslap.html

mysqlslap实践

  表结构的定义,索引的组织都会性能数据库的性能;那么问题就来了,我们如何量化一个变化对性能的影响,比如说把个列的数据类型

  由int 改成biging 之后对性能的影响有多大?要得到两都之间的差异我们只要进行两次测试就行了,面对这样的需求mysqlslap就能解决

  回到正题,本文的立意不是向读者展示一次测试的过程,而是想展示mysqlslap中表现出来的性质,主要是讲表表现的与笔者期望不一致

  的地方

  我设计了如下表结构用于mysqlslap的性能测试

create table log(id int not null auto_increment primary key,
connection_id int, -- 连接的id
access_time datetime(6) -- 执行操作的时间
);

  执行的SQL语句如下

  1、开始第一次执行

mysqlslap --host=127.0.0.1 --password= --user=root --password=xxxxxx --create="create table log(id int not null auto_increment primary key, connection_id int,access_time datetime(6));"  --query="insert into log(connection_id,access_time) values(connection_id(),now());" --concurrency=2
Benchmark
Average number of seconds to run all queries: 0.031 seconds
Minimum number of seconds to run all queries: 0.031 seconds
Maximum number of seconds to run all queries: 0.031 seconds
Number of clients running queries:
Average number of queries per client:

  --create 用于指定初始化语句 我这里就是建了个表

  --query  用于指定要执行的语句,我这里就执行一条insert

  --concurrency 用于指定并发度, 这里指定了两个并发的连接

  2、看一下mysqlslap在数据库留下了什么

show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)

  可以看到mysqlslap在执行完成后什么都没有留下,它把自己的库都给删除了 --no-drop 可以改变它的这一行为

mysqlslap --host=127.0.0.1 --password=3306 --user=root --password=mtls0352 --create=./create.sql --query=./query.sql --concurrency=2 --no-drop
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
Average number of seconds to run all queries: 0.032 seconds
Minimum number of seconds to run all queries: 0.032 seconds
Maximum number of seconds to run all queries: 0.032 seconds
Number of clients running queries: 2
Average number of queries per client: 1

  这个时候我们可以去数据库中查看一下mysqlslap给我们留下了什么

show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mysqlslap |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec) use mysqlslap;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> show tables;
+---------------------+
| Tables_in_mysqlslap |
+---------------------+
| log |
+---------------------+
1 row in set (0.00 sec) mysql> show create table log;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| log | CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`connection_id` int(11) DEFAULT NULL,
`access_time` datetime(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) mysql> select * from log;
+----+---------------+----------------------------+
| id | connection_id | access_time |
+----+---------------+----------------------------+
| 1 | 28 | 2018-09-01 12:36:05.000000 |
| 2 | 29 | 2018-09-01 12:36:05.000000 |
+----+---------------+----------------------------+
2 rows in set (0.00 sec)

  

  为了介绍mysqlslap中另一个比较重要的参数--iterations,我这里就不用mysqlslap这个数据库,我要自己建一个专门的数据库

create database tempdb;
use tempdb; create table log(id int not null auto_increment primary key,
connection_id int, -- 连接的id
access_time datetime(6) -- 执行操作的时间
);

  改mysqlslap的写法如下

mysqlslap --host=127.0.0.1 --password=3306 --user=root --password=mtls0352  --query="insert into tempdb.log(connection_id,access_time) values(connection_id(),now());" --concurrency=2 --iterations=4
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
Average number of seconds to run all queries: 0.026 seconds
Minimum number of seconds to run all queries: 0.023 seconds
Maximum number of seconds to run all queries: 0.030 seconds
Number of clients running queries: 2
Average number of queries per client: 1

  查看mysqlslap中留下的日志

select * from tempdb.log;
+----+---------------+----------------------------+
| id | connection_id | access_time |
+----+---------------+----------------------------+
| 1 | 50 | 2018-09-01 12:48:58.000000 |
| 2 | 49 | 2018-09-01 12:48:58.000000 |
| 3 | 51 | 2018-09-01 12:48:58.000000 |
| 4 | 52 | 2018-09-01 12:48:58.000000 |
| 5 | 54 | 2018-09-01 12:48:58.000000 |
| 6 | 53 | 2018-09-01 12:48:58.000000 |
| 7 | 55 | 2018-09-01 12:48:58.000000 |
| 8 | 56 | 2018-09-01 12:48:58.000000 |
+----+---------------+----------------------------+
8 rows in set (0.00 sec)

  这里总共 8 行就是 --concurrency=2 与 --iterations=4 的乘积,从connection_id 可以看出mysqlslap并没有对连接进行重用。

我对mysqlslap的一些看法

  讲一讲mysqlslap的生命周期、每一轮测试中mysqlslap都会经历如下三个阶段

    1): 建立连接 创建数据库 执行初始化步骤

    2): 执行查询--query中执行的操作

    3): 删除mysqlslap数据库 断开连接

    在--iterations 大于1的情况下重复上面的步骤iterations次

  总的来说mysqlslap是一个看上去很美,用起来一点都不让人省心的工具,比较说--no-drop和--iterations一起出现的时候它就不知道变通了,

  不知道变通就算了,最要命的问题在于长一点的SQL只要把并发调高一点mysqlslap就会hang住,第一次我用它的时候是抱着绝对的信任的,

  结果等了半天没有反映,现在想想自己当时还是太年轻了 too young !

  总的来说我更加喜欢sysbench!

  

----

mysqlslap 压力测试工具的更多相关文章

  1. MySQL自带的性能压力测试工具mysqlslap

    mysqlslap是从MySQL的5.1.4版开始就开始官方提供的压力测试工具. 通过模拟多个并发客户端并发访问MySQL来执行压力测试,同时提供了较详细的SQL执行数据性能报告,并且能很好的对比多个 ...

  2. mysqlslap 一个MySQL数据库压力测试工具

    在Xen/KVM虚拟化中,一般来说CPU.内存.网络I/O的虚拟化效率都非常高了,而磁盘I/O虚拟化效率较低,从而磁盘可能会是瓶颈.一般来说,数据库对磁盘I/O要求比较高的应用,可以衡量一下在客户机中 ...

  3. MySQL数据库基准压力测试工具之MySQLSlap使用实例

    一.Mysqlslap介绍 mysqlslap是MySQL5.1之后自带的benchmark基准测试工具,类似Apache Bench负载产生工具,生成schema,装载数据,执行benckmark和 ...

  4. mysql压力测试工具Mysqlslap

    mysql 性能测试工具:The MySQL Benchmark Suite(不支持多CPU而且不是压力工具) 压力测试工具: MySQL super-smack:需要找能连接外网的机器,能连接外网的 ...

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

    mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况 mysqlslap 的一个主要工作场景就是对数据库服务器做基准测试 ...

  6. 数据库相关文章转载(2) MySQL自带的性能压力测试工具mysqlslap详解

    PS:今天一同事问我有木有比较靠谱的mysql压力测试工具可用.其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开始的一 ...

  7. (总结)MySQL自带的性能压力测试工具mysqlslap详解

    PS:今天一同事问我有木有比较靠谱的mysql压力测试工具可用.其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开始的一 ...

  8. Mysql 压力测试工具 mysqlslap

    转载至文章作者:杜亦舒 链接:https://www.sdk.cn/news/4512 来源:SDK.cn 摘要:mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数 ...

  9. mysql之 mysql数据库压力测试工具(mysqlslap)

    mysqlslap是从MySQL的5.1.4版开始就开始官方提供的压力测试工具.通过模拟多个并发客户端并发访问MySQL来执行压力测试,同时提供了较详细的SQL执行数据性能报告,并且能很好的对比多个存 ...

随机推荐

  1. SQL Server时间戳

    select replace(replace(replace(replace(convert(varchar ,getdate() ,126) ,'-' ,'') ,' ' ,'') ,':' ,'' ...

  2. 算法笔记_231:网格中移动字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着.如图[1.jpg]所示. 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和 ...

  3. 解决BeautifulSoup库运行时报错问题

    解决BeautifulSoup库运行时报错问题 运行BeautifulSoup库时可能出现下面的错误,具体错误消息为:To get rid of this warning, change this: ...

  4. Anroid 4大组件之android.app.Service

    android.app.Service A Service is an application component representing either an application's desir ...

  5. 完善_IO, _IOR, _IOW, _IOWR 宏的用法与解析

    _IO, _IOR, _IOW, _IOWR 宏的用法与解析  原文地址:http://www.eefocus.com/ayayayaya/blog/12-03/245777_20cdd.html 作 ...

  6. vim 可视化模式(visual模式)

    转文章 为了便于选取文本,VIM 引入了可视(Visual)模式. 要选取一段文本,首先将光标移到段首,在普通模式下按 v 进入可视模式,然后把光标移到段末. 需要注意,光标所在字符是包含在选区中的 ...

  7. (转)Groupon前传:从10个月的失败作品修改,1个月找到成功 并不挶泥在这个点子上面,它反而往后站一步,看看他们已经做好的这个网站,可以再怎么包装成另一个完完全全不同的网站?所有的人所做的每件失败的事情中, 一定有碰到或含有成功的答案」在里面,只是他们不知道而已。 人不怕失败」,只怕宣布失败」

    (转)Groupon前传:从10个月的失败作品修改,1个月找到成功 今天读到 一个非常励志人心的故事 ,就像现在「叶问」有「前传」,最近很火红的团集购网站Groupon 也出现了「Groupon前传」 ...

  8. JAVA操作mysql

    所需jar包:mysql-connector-java.jar 代码: import java.sql.*; import java.util.ArrayList; import java.util. ...

  9. linux达人养成计划学习笔记(六)—— 挂载命令

    一.查询与自动挂载 mount #查询系统中已挂载的设备 mount -a #根据配置文件/etc/fstab的内容,自动挂载 二.挂载命令格式 mount [-t 文件系统] [-o 特殊选项] 设 ...

  10. Android程序员必备精品资源

    平时写程序中不断收集到的一些比较常用的东西,分享给大家. 实用工具集锦 Android Lifecycle https://github.com/xxv/android-lifecycle TinyP ...