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

📌 使用方法

  1. 安装插件

    • IDEA → SettingsPlugins → 搜索 "MyBatis Log Plugin" → 安装
  2. 开启 MyBatis 日志

    复制代码
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  3. 复制日志中的 SQL

    复制代码
    ==>  Preparing: SELECT * FROM adms_validation WHERE reward_status = ? AND ads_id = ?
    ==> Parameters: 0(Integer), J4842733427(String)
  4. 粘贴到 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

📌 安装与使用

  1. 下载并启动 Arthas

    复制代码
    curl -O https://arthas.aliyun.com/arthas-boot.jar
    java -jar arthas-boot.jar
    # 选择你的 Java 进程
  2. Trace Mapper 方法(查看 SQL 执行耗时)

    复制代码
    trace com.yourpackage.mapper.AdmsValidationMapper selectList
  3. 输出示例

    复制代码
    +---trace---+
    |  selectList()  cost: 120ms
    |    --> SQL: SELECT * FROM adms_validation WHERE ... 
    |    --> Parameters: [0, 'J4842733427']
    +-----------+
  4. 监控所有 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 生产 动态诊断,无侵入 学习成本略高
相关推荐
gihigo199814 小时前
MySQL中binlog、redolog与undolog的不同之处解析
数据库·mysql·oracle
熊大与iOS14 小时前
iOS 长截图的完美实现方案 - 附Demo源码
android·算法·ios
budingxiaomoli15 小时前
MYSQL表的增删改查
数据库·sql·mysql
独行soc15 小时前
2025年渗透测试面试题总结-42(题目+回答)
android·数据库·安全·adb·面试·渗透测试·sqlite
聪明努力的积极向上15 小时前
【MYSQL】GET_LOCK使用方法简单解析
数据库·mysql
艾伦~耶格尔16 小时前
【MySQL体系结构详解:一条SQL查询的旅程】
数据库·学习·mysql
千里马学框架17 小时前
安卓15 audio新专题发布:安卓系统手机车机音频audio子系统深入实战开发专题
android·智能手机·音视频
没有了遇见17 小时前
Android 虚拟环境之虚拟环境检测<完结版>
android
liang_jy17 小时前
Android 单元测试(二)—— 高级 Mock 技术
android·面试·单元测试