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

《MySQL 技术内幕(第5版)》逐章精华笔记第七章

第7章:性能诊断与慢SQL分析(完整版)

🎯 本章目标

  • 熟练使用慢查询日志、EXPLAIN、performance_schema 等工具

  • 掌握分析 SQL 执行瓶颈的流程

  • 学会识别并改写典型慢 SQL


一、慢查询日志简介

MySQL 提供慢查询日志机制,记录执行时间超过阈值的 SQL 语句

🔧 开启方式

-- 开启慢查询日志
SET GLOBAL slow_query_log = 1;
-- 设置慢查询阈值(单位:秒)
SET GLOBAL long_query_time = 1;
-- 是否记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = 1;

📦 慢日志默认写入文件:/var/lib/mysql/hostname-slow.log

📌 线上分析第一步:先开启日志 → 再用工具分析


二、常用分析工具

工具用途
mysqldumpslow官方工具,分析慢日志出现频次
pt-query-digest更强大的开源工具(推荐)
performance_schema内部视图,可实时追踪 SQL 执行耗时

✅ 使用 pt-query-digest 示例:

pt-query-digest /var/lib/mysql/mysql-slow.log

可输出:出现次数、平均执行时间、SQL 模板等


三、SQL 执行耗时构成

一条 SQL 的慢不仅可能是“索引没命中”,还有其他组件瓶颈。

📊 一条 SQL 耗时可能分为:

  • 解析时间(parse)

  • 优化器选择执行计划时间

  • 存储引擎取数据时间

  • 网络传输时间

  • 客户端处理慢(分页导致过多数据传输)

📌 不能只看“SQL 写得对不对”,也要看上下文环境


四、EXPLAIN 联合分析慢 SQL

样例慢 SQL:

SELECT * FROM orders WHERE customer_id = 1 ORDER BY create_time DESC LIMIT 100000, 10;

EXPLAIN 可能提示:

  • type = index

  • rows = 100000

  • Extra = Using filesort

📌 原因:大 OFFSET 会扫描大量无效数据 + 排序成本高

✅ 改写方式:使用“游标式分页”

SELECT * FROM orders
WHERE customer_id = 1 AND id > 上一页最大ID
ORDER BY id ASC LIMIT 10;

五、performance_schema 实战

performance_schema 是 MySQL 内置的性能分析系统

开启并使用:

-- 查看开启情况
SHOW VARIABLES LIKE 'performance_schema';-- 查询 SQL 语句耗时统计
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY AVG_TIMER_WAIT DESC LIMIT 5;

📌 可用于分析“哪类语句最慢”、“哪些语句最频繁”


六、典型慢 SQL 改写案例

1️⃣ 模糊匹配慢

-- 慢:不能用索引
SELECT * FROM user WHERE name LIKE '%张';-- 优:使用倒排索引或全文索引
ALTER TABLE user ADD FULLTEXT(name);
SELECT * FROM user WHERE MATCH(name) AGAINST('张');

2️⃣ or 条件未命中索引

-- 慢:
SELECT * FROM t WHERE a = 1 OR b = 2;-- 优:
SELECT * FROM t WHERE a = 1
UNION
SELECT * FROM t WHERE b = 2;

3️⃣ 函数操作字段导致索引失效

-- 慢:
SELECT * FROM t WHERE DATE(create_time) = '2024-01-01';-- 优:
SELECT * FROM t WHERE create_time BETWEEN '2024-01-01 00:00:00'AND '2024-01-01 23:59:59';

七、实战练习题

🧪 练习1:开启慢日志并模拟慢 SQL

SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 0;-- 执行一个大分页慢 SQL
SELECT * FROM orders ORDER BY id LIMIT 100000, 10;

✅ 自测题

  1. 慢查询日志记录什么内容?如何查看?

  2. 使用 pt-query-digest 可以分析出哪些指标?

  3. OFFSET 越大,SQL 越慢的本质原因是什么?

  4. 如何用 performance_schema 排查数据库热点 SQL?


八、图解 SQL 慢的常见根因

[慢SQL] → 排查方向:↳ 未命中索引? → EXPLAIN↳ 扫描行太多? → rows 字段↳ 排序文件大? → Using filesort↳ 网络传输慢? → 客户端限制分页大小↳ 后台阻塞严重? → SHOW PROCESSLIST↳ SQL 太多? → performance_schema 分析 top SQL

📌 不要盲目改 SQL,要“基于证据”定位问题!


📣 下一章我们将进入 第8章:InnoDB 存储引擎架构深度解析,包括:

  • Buffer Pool 缓存机制

  • 自适应哈希索引

  • 页刷新与写入策略

  • InnoDB 的多线程架构设计

http://www.lqws.cn/news/515791.html

相关文章:

  • 【学习笔记】3.3 Decoder-Only PLM
  • 芯片战争升级:进口马维尔VS自研中兴微,解码格行随身WiFi性能密码,格行随身WIFI到底行不行
  • 《从0到1:C/C++音视频开发自学指南》
  • 大语言模型的通用局限性与全球技术演进
  • 【智能协同云图库】智能协同云图库第二弹:用户管理系统后端设计与接口开发
  • CSS基础3
  • 将Python Tkinter程序转换为手机可运行的Web应用 - 详细教程
  • Nginx + Tomcat 负载均衡搭建
  • 数字孪生技术引领UI前端设计潮流:沉浸式体验的新篇章
  • CVPR-2025 | 上交拥挤无序环境下的具身导航最新基准!RoboSense:以机器人为中心的具身感知与导航大规模数据集
  • POJ3050-Hopscotch(穷竭搜索:DFS)
  • 构造函数和析构函数
  • 基于SSM框架+mysql实现的监考安排管理系统[含源码+数据库+项目开发技术手册]
  • 【iSAQB软件架构】架构模式
  • 微分转动与角速度:三维空间中的矩阵向量形式及其Python实现
  • Fiddler抓包工具与性能调优:如何结合Charles与Wireshark优化网络调试
  • 【机器学习深度学习】常见激活函数
  • AudioTrack使用
  • 网络安全就业方向与现实发展分析:机遇、挑战与未来趋势
  • Three.js项目实战:从零搭建小米SU7三维汽车
  • 《内心强大不怯场》读书笔记5
  • 南宫NG·28(中国)相信品牌力量/Vue 3 中的状态管理 —— 从 Vuex 到 Pinia 的全面过渡
  • NCCN Guidelines Navigator:数智化工具引领肿瘤精准治疗新纪元
  • 运维打铁: 系统内核参数调优实战
  • ‌RESTful API 设计规范
  • 无锁队列简易入门
  • Sivers毫米波产品系列全景图:覆盖通信、工业、交通、航天
  • Xcode缓存清除
  • 鸿蒙Next仓颉开发语言中的数据类型总结分享
  • java 导出word 实现循环表格