当前位置: 首页 > news >正文

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 → Settings → Plugins → 搜索 "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生产动态诊断,无侵入学习成本略高

http://www.dtcms.com/a/362072.html

相关文章:

  • java中的排序方法
  • 视频监控芯片:智慧安防的“隐形大脑”
  • Product Hunt 每日热榜 | 2025-09-01
  • 10.《基础知识探秘:DHCP地址分配员》
  • 【51单片机三路抢答器定时器1工作1外部中断1】2022-11-24
  • [Windows] 图片裁剪 v1.0 按比例裁剪图片部分另存
  • nginx关于root
  • 【大模型记忆-Mem0详解-3】安装和设置
  • 35.序列(中)
  • 在Linux系统中安装Jenkins(保姆级别)
  • Linux 下 MySQL 数据库定时备份脚本与 Crontab 配置
  • 在本地使用 Docker 创建一个易受攻击的云环境
  • Day23 机器学习流水线(管道/pipeline)
  • Windows系统安装Git详细教程
  • c# winform 拼图游戏
  • 随机获取集合里面的某一条数据
  • 利用Mybatis自定义排序规则实现复杂排序
  • UBUNTU之Onvif开源服务器onvif_srvd:1、编译
  • Java synchronized 关键字详解
  • JAVA后端开发——forEach 与方法引用(::)详解
  • 剧想智读项目展示
  • 针对redis中的热数据该怎么处理
  • Qt 项目文件(.pro)中添加 UI 文件相关命令
  • 【系规伴学】云资源规划核心知识点解析
  • vcruntime140.dll丢失解决办法
  • pandas自学笔记16 pandas可视化
  • 继承体系中的隐藏机制解析(继承中的作用域)
  • Unity图集 SpriteAltas 打包探究
  • [界面通过zmq请求调用指定动态库函数(三)]将zmq请求集成二次开发接口
  • Android 文件下载 FileDownloader