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 生产 动态诊断,无侵入 学习成本略高
相关推荐
补补234561 小时前
解决漫步者H180Plus(TypeC)耳机连接三星手机后每次播放音频出现滴滴声
android·音视频·三星·typec·edifier·h180plus·滴滴声
木易 士心2 小时前
Android Jetpack Compose 从入门到精通
android·android jetpack
TDengine (老段)2 小时前
TDengine 聚合函数 VAR_POP 用户手册
大数据·数据库·sql·物联网·时序数据库·tdengine·涛思数据
Taylor不想被展开3 小时前
SpringBoot 项目集成 Flyway
java·spring boot·mysql
xhbh6664 小时前
【硬核对比】Hive与MySQL全方位深度对比:从架构、SQL语法到应用场景,搞懂选型不踩坑
数据库·mysql·hive和mysql的区别
alexhilton4 小时前
如何构建Android应用:深入探讨原则而非规则
android·kotlin·android jetpack
2501_916013745 小时前
苹果应用上架全流程指南 iOS 应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验
android·ios·小程序·uni-app·cocoa·iphone·webview
zl9798997 小时前
MySQL-锁
数据库·mysql·database
Codeking__7 小时前
mysql——事务(下)
数据库·mysql
芦半山7 小时前
快速应用「幽灵调用」的正式修复
android·gradle