MySQLslap 是 MySQL 自带的轻量级基准测试工具,用于测量响应时间、并发能力与吞吐量等基础性能指标,适用于单条 SQL 优化验证、索引策略对比及配置调优后的 QPS 变化评估。

MySQLslap 是什么,它能测出什么
MySQLslap 是 MySQL 自带的轻量级基准测试工具,不是压测平台,也不模拟真实业务逻辑。它只负责按你指定的方式发起 SQL 请求,统计响应时间、并发能力、吞吐量这些基础指标。适合快速验证单条查询优化效果、对比不同索引策略、或检查配置调优后的 QPS 变化。
- 它不记录慢日志,不分析执行计划,不抓锁等待——这些得靠
EXPLAIN、SHOW PROFILE或performance_schema - 它默认用
SELECT测试,但支持自定义 SQL(含INSERT/UPDATE),不过事务控制很弱,不自动回滚 - 并发模型是“连接池式”,不是真实用户行为模拟;高并发下看到的瓶颈,可能是连接数限制或网络打满,而非 SQL 本身
怎么写一个靠谱的 MySQLslap 命令
关键不是参数堆得多,而是让测试贴近你要验证的场景。比如查用户列表,就别用默认的 SELECT * FROM t1;表不存在,它会报错退出,不会自动建。
- 必须指定
--host、--user、--password(或用配置文件),否则连不上 -
--auto-generate-sql看似方便,但生成的表结构和数据分布极不真实,容易掩盖索引失效问题 - 更推荐用
--query指向一个 SQL 文件,里面写好你真正关心的语句,例如:SELECT id, name FROM users WHERE status = ? AND created_at > ? -
--concurrency控制并发连接数,不是线程数;设为 10 不代表每秒 10 次请求,而是最多 10 个连接同时发请求 -
--iterations决定整个测试跑几轮,每轮都会重连、重置状态;设为 3 比设为 1 更能排除偶然抖动
示例命令:
mysqlslap --host=127.0.0.1 --user=root --password=xxx --database=testdb --query=./queries/select_user.sql --concurrency=20 --iterations=3 --number-of-queries=500
常见失败原因和对应解法
MySQLslap 报错往往不是 SQL 有问题,而是环境或参数没对齐:
- 报错
Unknown database 'testdb':说明--database指定的库不存在,它不会自动创建,需手动CREATE DATABASE - 报错
Column count doesn't match value count:出现在用--auto-generate-sql且指定了--auto-generate-sql-add-autoincrement时,字段数和值数不匹配,关掉这个参数即可 - 响应时间异常高,但实际业务没这么慢:检查是否用了
--no-defaults导致跳过了my.cnf里的连接池或超时配置 - 吞吐量上不去,CPU 却不高:大概率卡在网卡或 MySQL 的
max_connections限制,查SHOW STATUS LIKE 'Threads_connected'看是否已到上限
和 sysbench 相比,什么时候该换工具
MySQLslap 适合“改一条 SQL,立刻看快不快”这种粒度;一旦涉及多表关联、事务一致性、长连接复用、或需要持续压测 10 分钟以上,它就力不从心了。
- 它不支持自定义变量绑定(比如每次
WHERE id = ?中的 ? 都要手动生成),sysbench 的--oltp-point-selects类参数更可控 - 它没有结果持久化机制,每次运行完只能看终端输出;sysbench 支持写入 CSV 或直接对接 Prometheus
- 如果你正在调
innodb_buffer_pool_size,MySQLslap 的缓存命中率变化根本不可见,而 sysbench 能通过innodb_buffer_pool_reads和innodb_buffer_pool_read_requests算出命中率
真要测数据库整体承载力,别硬撑——换 sysbench,哪怕只多花十分钟装。
MySQLslap 最容易被忽略的一点:它默认关闭查询缓存(query_cache_type=0),但如果你的 MySQL 5.7 实例里开了缓存,而测试时又没加 --query-cache-type=0,结果就会严重失真。



















