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 生产 动态诊断,无侵入 学习成本略高
相关推荐
JanelSirry2 小时前
MySQL分区表(PARTITION):水平分表示例 (基于用户ID哈希分表)不依赖第三方中间件
mysql·中间件·哈希算法
李白你好3 小时前
一款专业的多数据库安全评估工具,支持 **PostgreSQL、MySQL、Redis、MSSQL** 等多种数据库的后渗透操作
数据库·mysql·postgresql
2501_916007473 小时前
iOS 混淆工具链实战,多工具组合完成 IPA 混淆与加固(iOS混淆|IPA加固|无源码混淆|App 防反编译)
android·ios·小程序·https·uni-app·iphone·webview
恋红尘3 小时前
Mysql
数据库·mysql
Jeled4 小时前
Retrofit 与 OkHttp 全面解析与实战使用(含封装示例)
android·okhttp·android studio·retrofit
ii_best7 小时前
IOS/ 安卓开发工具按键精灵Sys.GetAppList 函数使用指南:轻松获取设备已安装 APP 列表
android·开发语言·ios·编辑器
2501_915909067 小时前
iOS 26 文件管理实战,多工具组合下的 App 数据访问与系统日志调试方案
android·ios·小程序·https·uni-app·iphone·webview
m0_64880493_江哥7 小时前
用正则方法从中英文本提取英文的python示例
python·mysql·正则表达式
limingade8 小时前
手机转SIP-手机做中继网关-落地线路对接软交换呼叫中心
android·智能手机·手机转sip·手机做sip中继网关·sip中继
九皇叔叔8 小时前
Linux Shell 正则表达式:从入门到实战,玩转文本匹配与处理
linux·mysql·正则表达式