当前位置: > > > mysqlslap - MySQL自带的数据库压力测试工具使用详解(附样例)

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

1,基本介绍

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

2,简单用法

(1)我们执行如下命令对数据库做一个简单的自动测试,--auto-generate-sql 作用是自动生成测试 SQL
注意:如果我们没有人为指定测试数据库,则默认是 mysqlslap(该数据库会自动创建,测试完毕自动删除)。
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:每个客户端运行查询的平均数

3,打印实际的测试过程

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

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

4,添加并发

(1)我们可以添加如下两个参数,模拟并发处理查询请求:
  • --concurrency=100:指定同时有 100 个客户端连接
  • --number-of-queries=1000:指定总的测试查询次数(并发客户端数 * 每个客户端的查询次数),这样本样例平均每个客户端查询 10
mysqlslap -uroot -pHangge_123 --concurrency=100 --number-of-queries=1000 --auto-generate-sql

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

5,重复的次数

(1)使用 --iterations 参数可以设置迭代执行的次数,即重复的次数(相同的测试进行 N 次,求一个平均值)。该次数指的是整个步骤的重复次数,包括准备数据、测试 load、清理。
mysqlslap -uroot -pHangge_123 --iterations=3 --concurrency=100 --number-of-queries=1000 --auto-generate-sql

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

6,自动生成复杂表

(1)自动测试时,创建的表结构非常简单,只有两列,实际的产品环境肯定会更复杂,我们可以使用参数指定测试表的列的数量和类型:
  • --number-int-cols=5:指定生成 5int 类型的列
  • --number-char-cols=20:指定生成 20char 类型的列
mysqlslap -uroot -pHangge_123 --number-int-cols=5 --number-char-cols=20 --auto-generate-sql

(2)执行结果如下:

7,使用自己的测试库和测试语句

(1)自动测试可以帮助我们了解硬件层面的状况,我们也可以对指定的产品库进行测试:
  • --create-schema=hangge:指定的测试库是 hangge(测试完毕不会自动删除)
  • --query="SELECT * FROM people;":使用自定义的测试语句
mysqlslap -uroot -pHangge_123 --concurrency=10 --number-of-queries=100 --create-schema=hangge --query="SELECT * FROM people"

(2)自定义的测试语句可以同时写多条:
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 文件中语句间的分隔符是;
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 命令时报如下错误:

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

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

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

    使用 mysqlslap 也可以在数据库中构建大量的基础数据(比如千万级别数据)进行查询操作的性能测试或者 sql 优化,具体操作可以参考我写的另一篇文章:
评论0