mysqlslap 是 MySQL 自带的轻量级压力测试工具,用于验证单条 SQL 或简单查询在并发下的响应能力、QPS 上限和连接稳定性,不测磁盘 IO、不分析慢查、不模拟真实业务。

mysqlslap 是什么,它能测出什么
mysqlslap 是 MySQL 自带的轻量级压力测试工具,不是性能调优神器,也不模拟真实业务逻辑。它适合快速验证单条 SQL 或简单查询在并发下的响应能力、QPS 上限和连接稳定性。
它不测磁盘 IO 瓶颈、不分析慢查询原因、不反映应用层连接池行为。如果你看到 mysqlslap 报出高延迟,但实际业务没卡顿,大概率是测试模型和真实负载不匹配。
怎么写一个靠谱的 mysqlslap 命令
关键不是堆参数,而是让测试贴近你最常跑的那类语句。默认不指定 --query 时,它用内置的简单建表+插入+查询,完全没参考价值。
- 必须用
--query指定你要压测的真实 SQL,比如--query="SELECT * FROM users WHERE status = ?" - 用
--create-schema显式指定库名,避免误写到test库;别依赖--auto-generate-sql,它生成的数据分布极不均匀 - 并发数从低往高试:
--concurrency=10,20,50,别一上来就--concurrency=1000,MySQL 连接数可能直接打满 - 加
--iterations=3多跑几次取平均,单次结果波动大,尤其在低并发下
示例:mysqlslap --host=localhost --user=root --password=xxx --create-schema=testdb --query="SELECT id,name FROM users WHERE created_at > DATE_SUB(NOW(), INTERVAL 7 DAY)" --concurrency=20 --iterations=3 --number-of-queries=1000
常见报错和对应处理
Access denied for user:检查账号是否有 PROCESS 权限(mysqlslap 需要读取 INFORMATION_SCHEMA);本地测试建议用 --socket 而非 --host,绕过网络鉴权链路
Too many connections:不是并发设太高,而是 MySQL 的 max_connections 默认值太小(通常 151),临时调高:SET GLOBAL max_connections = 500;
Unknown column 'xxx' in 'where clause':说明 --query 里写的字段在目标表中不存在,或大小写不一致(Linux 下表名/字段名区分大小写)
Query OK, 0 rows affected 类返回:出现在用了 --auto-generate-sql 且未指定 --engine 时,InnoDB 表创建失败回退到 MyISAM,而后者在新版本已废弃——务必加 --engine=innodb
压测结果怎么看,哪些数字真有用
输出里真正该盯住的只有三行:Average number of seconds to run all queries(总耗时均值)、Minimum number of seconds to run all queries(最快一轮)、Number of clients running queries(实际并发数是否达标)
- 如果
Average和Minimum差 3 倍以上,说明存在明显抖动,可能是锁竞争、刷脏页或临时表写磁盘 - 注意
Number of clients是否等于你设的--concurrency,若远小于,说明连接建立失败或被拒绝,回头查max_connections或防火墙 - 忽略
Queries per second单一数值——它把建连、认证、结果传输全算进去了,不代表纯 SQL 执行速度
真实瓶颈往往藏在 MySQL 的 SHOW PROCESSLIST 和 slow_query_log 里,mysqlslap 只是帮你把“哪类语句值得深挖”圈出来


















