✅ 1. EXPLAIN FORMAT=JSON —— 深度解析执行计划

🔍 作用

比普通 EXPLAIN 提供更详细的执行信息,包括:

  • 各表访问成本(cost_info
  • 索引使用细节
  • 是否使用临时表、排序
  • JOIN 顺序与驱动策略

📌 使用方法

EXPLAIN FORMAT=JSON
SELECT u.username, v.n_time
FROM abc v
JOIN user_info u ON v.uid = u.uid
WHERE v.n_time > '2025-08-01'
  AND v.d_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", "d_status", "n_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 '%s_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 → Settings → Plugins → 搜索 "MyBatis Log Plugin" → 安装
  2. 开启 MyBatis 日志

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

    ==>  Preparing: SELECT * FROM abc WHERE d_status = ? AND s_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 abc WHERE ... 
    |    --> Parameters: [0, '123']
    +-----------+
  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 生产 动态诊断,无侵入 学习成本略高

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐