MySQL 性能调优与 SQL 优化的核心利器
✅ 1. EXPLAIN FORMAT=JSON
—— 深度解析执行计划
🔍 作用
比普通 EXPLAIN
提供更详细的执行信息,包括:
- 各表访问成本(
cost_info
) - 索引使用细节
- 是否使用临时表、排序
- JOIN 顺序与驱动策略
📌 使用方法
EXPLAIN FORMAT=JSON
SELECT u.username, v.verification_time
FROM adms_validation v
JOIN user_info u ON v.uid = u.uid
WHERE v.verification_time > '2025-08-01'AND v.reward_status = 0;
📄 输出示例(关键部分):
{"query_block": {"nested_loop": [{"table": {"table_name": "v","access_type": "range","possible_keys": ["idx_profit_sharing"],"key": "idx_profit_sharing","rows_examined_per_scan": 1200,"cost_info": {"read_cost": "1000.00","eval_cost": "120.00","prefix_cost": "1120.00"},"used_columns": ["id", "uid", "reward_status", "verification_time"]}},{"table": {"table_name": "u","access_type": "ref","key": "idx_uid","rows_examined_per_scan": 1,"cost_info": {"read_cost": "1.00","eval_cost": "0.10","prefix_cost": "1121.10"}}}],"cost_info": {"query_cost": "1121.10"}}
}
✅ 关键字段解读
字段 | 含义 | 优化建议 |
---|---|---|
access_type | 访问类型 | 避免 ALL ,目标 ref /range |
key | 使用的索引 | 是否命中预期索引 |
rows_examined_per_scan | 扫描行数 | 越小越好 |
read_cost + eval_cost | 成本 | 总成本越低越好 |
query_cost | 总成本 | 用于对比不同 SQL 的优劣 |
💡 用途:对比两个 SQL 哪个更优?用
query_cost
判断!
✅ 2. Performance Schema —— 实时性能监控
🔍 作用
MySQL 内置的性能诊断框架,可监控:
- SQL 执行时间、锁等待、IO、内存使用等
- 哪些 SQL 最耗时?谁在用索引?是否有锁竞争?
📌 开启与使用
(1)确认开启:
SHOW VARIABLES LIKE 'performance_schema';
-- 应为 ON
(2)查看最慢的 SQL(按平均延迟):
SELECT DIGEST_TEXT AS sql_template,COUNT_STAR AS exec_count,AVG_TIMER_WAIT / 1000000000 AS avg_ms,MAX_TIMER_WAIT / 1000000000 AS max_ms,ROWS_EXAMINED_AVG,ROWS_SENT_AVG
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT LIKE '%adms_validation%'
ORDER BY AVG_TIMER_WAIT DESC
LIMIT 10;
(3)查看是否有全表扫描:
SELECT DIGEST_TEXT, NO_INDEX_USED_COUNT
FROM performance_schema.events_statements_summary_by_digest
WHERE NO_INDEX_USED_COUNT > 0
ORDER BY NO_INDEX_USED_COUNT DESC;
✅ 优势
- 实时监控,无需慢日志
- 可定位“高频低耗时但总量大”的 SQL
✅ 3. pt-query-digest
—— 慢查询日志分析神器
🔍 作用
Percona Toolkit 中的工具,用于分析 slow.log
,生成性能报告。
📌 安装(Linux)
# Ubuntu/Debian
wget https://www.percona.com/downloads/percona-toolkit/LATEST/debian/percona-toolkit_3.5.0-1.jammy_amd64.deb
sudo dpkg -i percona-toolkit_*.deb# 或 yum
yum install percona-toolkit
📌 分析慢日志
pt-query-digest /var/log/mysql/slow.log > slow_report.txt
📄 报告内容示例
# 1.2s user time, 120ms system time, 24.1M rss, 114.1M vsz
# 100ms user time, 10ms system time
# 100ms user time, 10ms system time# 100ms user time, 10ms system time# 100ms user time, 10ms system time# Rank Query ID Response time Calls R/Call V/M Item
# 1 0x123ABC... 120.00s 30.0% 1000 0.120s 0.01 SELECT adms_validation
# 2 0x456DEF... 80.00s 20.0% 500 0.160s 0.02 SELECT user_info# Query 1: 1000 calls, 120.00s, 0.120s avg, 100ms max
# Time range: 2025-08-01 00:00:00 to 2025-08-31 23:59:59
# Examined rows by query: 10000 avg
# Query:
# SELECT * FROM adms_validation WHERE reward_status = 0 AND verification_time > '2025-08-01';
✅ 优势
- 自动聚合相似 SQL
- 统计调用次数、总耗时、平均耗时
- 定位“最影响系统”的 SQL
✅ 4. MyBatis Log Plugin(IDEA 插件)—— 开发者福音
🔍 作用
将 MyBatis 控制台输出的“预编译 SQL + 参数”自动拼接成可执行的完整 SQL。
📌 使用方法
安装插件:
- IDEA →
Settings
→Plugins
→ 搜索 "MyBatis Log Plugin" → 安装
- IDEA →
开启 MyBatis 日志:
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
复制日志中的 SQL:
==> Preparing: SELECT * FROM adms_validation WHERE reward_status = ? AND ads_id = ? ==> Parameters: 0(Integer), J4842733427(String)
粘贴到 IDEA,右键 → "MyBatis Log Plugin" → "Format SQL"
✅ 输出结果:
SELECT *
FROM adms_validation
WHERE reward_status = 0 AND ads_id = 'J4842733427';
💡 用途:开发调试时快速复制 SQL 到 Navicat/MySQL 客户端执行分析
✅ 5. Arthas(阿尔萨斯)—— 生产环境诊断神器
🔍 作用
阿里巴巴开源的 Java 诊断工具,可在不重启、不修改代码的情况下:
- 查看 JVM 中执行的 SQL
- Trace 方法调用链
- 监控慢 SQL
📌 安装与使用
下载并启动 Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar # 选择你的 Java 进程
Trace Mapper 方法(查看 SQL 执行耗时)
trace com.yourpackage.mapper.AdmsValidationMapper selectList
输出示例:
+---trace---+ | selectList() cost: 120ms | --> SQL: SELECT * FROM adms_validation WHERE ... | --> Parameters: [0, 'J4842733427'] +-----------+
监控所有 SQL 执行
watch com.baomidou.mybatisplus.core.mapper.BaseMapper selectList '{params, returnObj}' -x 2
✅ 优势
- 生产环境安全诊断
- 可定位“偶发性慢 SQL”
- 支持 Spring Boot、MyBatis、MyBatis-Plus
📊 工具对比总结
工具 | 适用阶段 | 优点 | 缺点 |
---|---|---|---|
EXPLAIN FORMAT=JSON | 开发/测试 | 成本分析,精准 | 静态分析,不反映真实负载 |
Performance Schema | 生产/测试 | 实时监控,无需日志 | 需要开启,有一定性能开销 |
pt-query-digest | 生产 | 慢 SQL 分析,聚合统计 | 需要开启慢日志 |
MyBatis Log Plugin | 开发 | 快速格式化 SQL | 仅限开发环境 |
Arthas | 生产 | 动态诊断,无侵入 | 学习成本略高 |