mysqlslap 是 MySQL 自带的轻量级基准测试工具,用于快速验证服务响应、简单 SQL 并发表现及索引/表结构优化效果,但无法检测事务一致性、连接池、慢查询外的深层瓶颈。

mysqlslap 是什么,它能测出什么问题
mysqlslap 是 MySQL 自带的轻量级基准测试工具,不是生产级压测方案,但能快速验证安装后服务是否响应正常、简单 SQL 的并发表现、不同索引或表结构下的性能差异。它不模拟真实业务逻辑,也不处理连接池、事务一致性或长连接复用——所以别指望靠它发现慢查询优化外的深层瓶颈。
常见误用是直接拿默认参数跑 mysqlslap --auto-generate-sql 就以为测出了“数据库性能”,其实那只是在空库上跑随机 INSERT/SELECT,结果几乎没参考价值。
必须设置的关键参数才能得到有效结果
不指定用户、数据库和具体语句,mysqlslap 默认会创建临时库和表再删掉,这个过程本身就会干扰结果,尤其在权限受限或 tmpdir 空间小的环境里容易报错。
- 用
--user和--password显式指定有 CREATE/INSERT/SELECT 权限的账号,避免权限拒绝导致中途退出 - 用
--database指向一个已存在的、有代表性数据量的库(比如你刚导入的测试库),否则--auto-generate-sql生成的 100 行假数据根本测不出索引效果 - 用
--query或--query-file固定 SQL,例如--query="SELECT * FROM users WHERE id = ?",配合--number-of-queries控制总请求数,避免随机语句掩盖真实热点 - 并发控制靠
--concurrency(单次并发数)和--iterations(重复轮次),例如--concurrency=10,50,100 --iterations=3才能看出压力增长趋势
典型错误:Connection refused / Access denied / Unknown database
这些报错基本都指向配置没对齐:
-
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (111)→ 检查mysqlslap是否用了--host,本地 socket 连接时应加--socket=/var/run/mysqld/mysqld.sock(路径以mysql --socket输出为准) -
Access denied for user 'test'@'localhost'→ 账号没被授予SELECT或CREATE TEMPORARY TABLES权限,运行GRANT SELECT, INSERT, CREATE TEMPORARY TABLES ON testdb.* TO 'test'@'localhost'; FLUSH PRIVILEGES; -
Unknown database 'mysqlslap_test'→ 关掉--auto-generate-sql,改用已有库 +--create-schema指向真实库名,或提前建好库并赋权
一次可用的最小完整命令示例
假设你有个叫 testdb 的库,里面 orders 表有 10 万行,想测主键查询延迟和并发吞吐:
mysqlslap \ --user=test \ --password=123456 \ --host=127.0.0.1 \ --port=3306 \ --database=testdb \ --query="SELECT * FROM orders WHERE order_id = FLOOR(1 + RAND() * 100000)" \ --concurrency=20,50,100 \ --iterations=3 \ --number-of-queries=3000 \ --verbose
注意:这里 FLOOR(1 + RAND() * 100000) 是为了从实际数据范围中取 ID,避免查不到返回空结果影响统计;--verbose 必须加上,否则只输出平均时间,看不到每轮的波动和失败率。
真正容易被忽略的是冷启动效应——第一次运行总会比后面慢一截,所以 --iterations=3 不是凑数,而是要丢弃首轮、取后两轮均值;另外,如果 orders 表没主键或没走索引,mysqlslap 报的“Query_time”会包含全表扫描耗时,这和你线上慢日志里的 Using where; Using filesort 是一回事,得回头去查执行计划。











