mysqlslap 是 MySQL 从 5.1.4 版开始官方自带的一个压力测试工具。它通过模拟多个并发客户端访问 MySQL 来执行压力测试,我们通过结果信息可以了解数据库的性能状况。
--concurrency
:并发量,也就是模拟多少个客户端同时执行命令。可指定多个值,以逗号或者 –delimiter
参数指定的值做为分隔符
--iterations
:测试执行的迭代次数。
--number-int-cols
:自动生成的测试表中包含多少个数字类型的列,默认 1 。此处设置为 1 的原因是,因为我们上面 sysbench 我们生成了一个 int 类型的字段。
--number-char-cols
:自动生成的测试表中包含多少个字符类型的列,默认 1 。此处设置为 2 的原因是,因为我们上面 sysbench 我们生成了一个 char 类型的字段。
--auto-generate-sql
:自动生成测试表和数据。这个命令,带来的效果,就类似 sysbench 命令的 prepare 指令。
--auto-generate-sql-add-autoincrement
:增加 auto_increment
一列。
如果想看,生成的具体脚本,可以用 –only-print
指令,只打印测试语句而不实际执行。
--engine
:创建测试表所使用的存储引擎,可指定多个。
--number-of-queries
:总的测试查询次数(并发客户数×每客户查询次数)。
--create-schema
:测试的 schema ,MySQL中 schema 也就是 database 数据库名。
-uroot -pMyNewPass4!
:设置 MySQL 账号和密码。
1、初步使用
我们执行如下命令对数据库做一个简单的自动测试,–auto-generate-sql 作用是自动生成测试 SQL。
注意:如果我们没有人为指定测试数据库,则默认是 mysqlslap(该数据库会自动创建,测试完毕自动删除)。
mysqlslap -uroot -p123456 --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、打印实际的测试过程:
测试的过程需要生成测试表,插入测试数据,我们可以添加 --only-print 来打印实际的测试过程(不会实际执行):
mysqlslap -uroot -p123456 --auto-generate-sql --only-print
测试完成后会自动删除测试库。
4、添加并发:
--concurrency=100
:指定同时有 100 个客户端连接
--number-of-queries=1000
:指定总的测试查询次数(并发客户端数 * 每个客户端的查询次数),这样本样例平均每个客户端查询 10 次
mysqlslap -uroot -p123456 --concurrency=100 --number-of-queries=1000 --auto-generate-sql
5、重复:
使用 --iterations
参数可以设置迭代执行的次数,即重复的次数(相同的测试进行 N 次,求一个平均值)。该次数指的是整个步骤的重复次数,包括准备数据、测试 load、清理。
mysqlslap -uroot -p123456 --iterations=3 --concurrency=100 --number-of-queries=1000 --auto-generate-sql
6、自动生成复杂表:
--number-int-cols=5
:指定生成 5 个 int 类型的列
--number-char-cols=20
:指定生成 20 个 char 类型的列
mysqlslap -uroot -pHangge_123 --number-int-cols=5 --number-char-cols=20 --auto-generate-sql
7、自行编写表与语句:
--create-schema=agent
:指定的测试库是 agent(测试完毕不会自动删除)
--query="SELECT * FROM t_call where id='123455';"
:使用自定义的测试语句
mysqlslap -uroot -p123456 --concurrency=10 --number-of-queries=100 --create-schema=agent --query="SELECT * FROM t_call where id='123455';"
查询语句也可以写多条,中间用封号隔开。
mysqlslap -uroot -pHangge_123 --concurrency=10 --number-of-queries=100 --create-schema=hangge --query="SELECT * FROM t_call where id='123455';SELECT * FROM t_call"
测试多个复杂的语句,我们也可以先把多个查询语句写入了一个 sql 文件中,然后使用此文件执行测试:
--query="select_query.sql"
:指定了测试文件是 select_query.sql
--delimiter=";"
:指定 sql 文件中语句间的分隔符是;
mysqlslap -uroot -p123456 --concurrency=10 --number-of-queries=100 --create-schema=agent --query="select_query.sql" --delimiter=";"
用自己的库插入测试时,会出现数据量不够的情况,那么如何使用这个工具快速生成大量工具呢?
我们执行如下命令实现数据插入,为提高效率这里开启 10 个客户端线程同时插入,总共执行 1 百万次操作:
mysqlslap -uroot -p123456 --concurrency=10 --number-of-queries=1000000 --create-schema=agent --query="
INSERT INTO
t_call_test(id, call_id, SESSIONID, TYPE, PGS, ROLE, TXT, BG, ED, SPEED, AGENT_ID, CREATE_TIME, MODIFY_TIME)
VALUES(uuid(), uuid(), uuid(), 1, 1,1, '你好,今天天气怎么样', 10, 20, 50, '100001', now(), now())"
执行完毕,服务器用时68.97秒,查看数据库发现已有。