mysqlslap - MySQL自带的数据库压力测试工具使用详解

叙述

  • mysqlslap 是 MySQL 从 5.1.4 版开始官方自带的一个压力测试工具。它通过模拟多个并发客户端访问 MySQL 来执行压力测试,我们通过结果信息可以了解数据库的性能状况。
  • mysqlslap 是系统运维和 DBA 人员应该掌握一些常见的压力测试工具之一,其主要工作场景就是对数据库服务器做基准测试。比如:服务器的硬件资源能够支持多大的访问压力呢?优化了操作系统的内核参数后,是否提升了性能?调整了 MySQL 配置参数后,对性能有多少影响?

解决方案

(1)我们执行如下命令对数据库做一个简单的自动测试,--auto-generate-sql 作用是自动生成测试 SQL。

注意:如果我们没有人为指定测试数据库,则默认是 mysqlslap(该数据库会自动创建,测试完毕自动删除)。

1

mysqlslap -uroot -pHangge_123 --auto-generate-sql


(2)运行结果如下:

  • Average number of seconds to run all queries:运行所有语句的平均秒数
  • Minimum number of seconds to run all queries:运行所有语句的最小秒数
  • Maximum number of seconds to run all queries:运行所有语句的最大秒数
  • Number of clients running queries:客户端数量
  • Average number of queries per client:每个客户端运行查询的平均数

原文:mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)

(1)测试的过程需要生成测试表,插入测试数据,我们可以添加 --only-print 来打印实际的测试过程(不会实际执行):

1

mysqlslap -uroot -pHangge_123 --auto-generate-sql --only-print


(2)运行结果如下,可以看到整个测试完成后会自动删除测试库,不会在数据库中留下痕迹。

原文:mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)

(1)我们可以添加如下两个参数,模拟并发处理查询请求:

  • --concurrency=100:指定同时有 100 个客户端连接
  • --number-of-queries=1000:指定总的测试查询次数(并发客户端数 * 每个客户端的查询次数),这样本样例平均每个客户端查询 10 次

1

mysqlslap -uroot -pHangge_123 --concurrency=100 --number-of-queries=1000 --auto-generate-sql


(2)运行结果如下(注意结果是完成 1000 次查询的总时间):

原文:mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)

(1)使用 --iterations 参数可以设置迭代执行的次数,即重复的次数(相同的测试进行 N 次,求一个平均值)。该次数指的是整个步骤的重复次数,包括准备数据、测试 load、清理。

1

mysqlslap -uroot -pHangge_123 --iterations=3 --concurrency=100 --number-of-queries=1000 --auto-generate-sql


(2)执行结果如下(注意结果是完成 1000 次查询的总时间):

原文:mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)

(1)自动测试时,创建的表结构非常简单,只有两列,实际的产品环境肯定会更复杂,我们可以使用参数指定测试表的列的数量和类型:

  • --number-int-cols=5:指定生成 5 个 int 类型的列
  • --number-char-cols=20:指定生成 20 个 char 类型的列

1

mysqlslap -uroot -pHangge_123 --number-int-cols=5 --number-char-cols=20 --auto-generate-sql


(2)执行结果如下:

原文:mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)

(1)自动测试可以帮助我们了解硬件层面的状况,我们也可以对指定的产品库进行测试:

  • --create-schema=hangge:指定的测试库是 hangge(测试完毕不会自动删除)
  • --query="SELECT * FROM people;":使用自定义的测试语句

1

mysqlslap -uroot -pHangge_123 --concurrency=10 --number-of-queries=100 --create-schema=hangge --query="SELECT * FROM people"


(2)自定义的测试语句可以同时写多条:

1

mysqlslap -uroot -pHangge_123 --concurrency=10 --number-of-queries=100 --create-schema=hangge --query="SELECT * FROM people;SELECT AVG(age) FROM people"


(3)如果测试多个复杂的语句,我们也可以先把多个查询语句写入了一个 sql 文件中,然后使用此文件执行测试:

  • --query="select_query.sql":指定了测试文件是 select_query.sql
  • --delimiter=";":指定 sql 文件中语句间的分隔符是;

1

mysqlslap -uroot -pHangge_123 --concurrency=10 --number-of-queries=100 --create-schema=hangge --query="select_query.sql" --delimiter=";"

附一:解决“unknown variable 'default-character-set=utf8'”错误

(1)如果我们执行 mysqlslap 命令时报如下错误:

原文:mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)

(2)解决办法有两种。一种是编辑 MySQL 配置文件 /etc/my.cnf,将里面如下配置注释掉:

1

#default-character-set=utf8

原文:mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)


(3)或者我们可以在命令中添加 --no-defaults 参数(该参数必须放在第一位),使得本次命令不读取默认配置参数:

原文:mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)

附二:快速生成大量测试数据 

使用 mysqlslap 也可以在数据库中构建大量的基础数据(比如千万级别数据)进行查询操作的性能测试或者 sql 优化

有时我们需要在数据库中构建大量的基础数据(比如千万级别数据)进行查询操作的性能测试或者 sql 优化。我们通常会采用如下两种方式来创建测试数据:

  • 方式一:编写代码,通过代码批量插库
  • 方式二:编写存储过程和函数执行

    但这两种方法都略显麻烦,本文使用 MySQL 自带的压力测试工具 mysqlslap 来实现测试数据的构建。

假设我们要在 people 表里插入 1 百万条随机的测试数据,表结构如下:

原文:MySQL - 快速生成大量测试数据方法(无需编写代码、或存储过程)

 

我们执行如下命令实现数据插入,为提高效率这里开启 10 个客户端线程同时插入,总共执行 1 百万次操作:

1

mysqlslap -uroot -pHangge_123 --concurrency=10 --number-of-queries=1000000 --create-schema=hangge --query="INSERT INTO people(name,age) VALUES (uuid(), RAND() * 100)"

执行完毕可以发现总耗时 208 秒:

原文:MySQL - 快速生成大量测试数据方法(无需编写代码、或存储过程)

查看数据库,可以发现测试数据已经创建成功:

原文:MySQL - 快速生成大量测试数据方法(无需编写代码、或存储过程)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值