🔍 慢 SQL 分析与 SQL 优化实战指南、

🧠前言

在数据库性能调优中,慢 SQL 是性能瓶颈的常见元凶
一次慢查询可能会拖垮整个业务线程池,甚至引发锁等待、雪崩效应。
对后端开发与 DBA 而言,快速定位并优化慢 SQL,能显著提升系统的吞吐量与稳定性。

优化的价值:

  • 提升查询响应速度
  • 降低数据库 CPU/IO 消耗
  • 提高并发承载能力
  • 减少死锁与锁等待概率

    文章目录

    • 🔍 慢 SQL 分析与 SQL 优化实战指南、
      • 🧠前言
    • 一、慢 SQL:性能杀手
      • 💡 慢 SQL 定义与成因
      • ⚠️ 常见慢 SQL 场景
    • 二、慢查询定位技巧
      • ⚙️ 开启慢日志
      • 🔧 日志分析工具
    • 三、SQL 调优误区
      • ⚠️ 常见优化陷阱
      • 💡 分页优化对比
    • 四、Explain 执行计划解密
      • 💡 Explain 关键字段解读
      • 📊 执行计划表示例
      • ⚠️ 危险信号
    • 五、联合索引优化实战
      • 💡 最左前缀原则
      • ⚙️ 案例:电商订单查询优化
    • 六、SQL 优化流程
      • 🔄 优化四步法
      • ⚙️ 优化策略优先级
      • 📈 优化效果对比
    • 七、实战经验与建议
      • 🛡️ 慢 SQL 预防体系
      • ⚡️ 监控命令速查
      • 📝 SQL 开发规范
    • 八、总结
      • 🏆 优化黄金法则
      • 📚 推荐工具清单

一、慢 SQL:性能杀手

💡 慢 SQL 定义与成因

45%25%15%10%5%慢 SQL 成因分布索引失效锁等待数据量暴增执行计划错误其他

⚠️ 常见慢 SQL 场景

场景表现影响
全表扫描rows 值巨大CPU/IO 飙升
锁等待事务阻塞响应延迟
排序临时表Using temporary内存溢出
深度分页LIMIT 100000,10扫描全表

什么是慢查询
MySQL 定义慢查询为:
执行时间超过 long_query_time(默认 10 秒)的 SQL,并且没有命中慢日志白名单。

常见导致慢 SQL 的场景
1.索引失效:查询条件未命中索引,或索引被错误使用。

2.锁等待:事务持有锁时间过长,导致后续 SQL 阻塞。

3.数据量暴增:表行数增长导致原本的 SQL 变慢。

4.执行计划错误:优化器选择了低效索引或全表扫描。

5.复杂 JOIN:大表关联且缺乏合适索引。

6.分页深度过大:LIMIT offset, size 在高 offset 下性能极差。

7.函数或类型转换:在索引列上做计算导致无法走索引。

二、慢查询定位技巧

⚙️ 开启慢日志

-- 查看慢日志配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';-- 动态设置(重启失效)
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1; -- 单位:秒-- 永久配置 my.cnf
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

🔧 日志分析工具

# mysqldumpslow 基础分析
mysqldumpslow -s t /var/log/mysql/slow.log# pt-query-digest 高级分析
pt-query-digest /var/log/mysql/slow.log# 输出示例
# Rank   Response time    Calls  Query
# ====   =============    =====  =====
# 1      112.2345s        25      SELECT * FROM orders WHERE ...

三、SQL 调优误区

⚠️ 常见优化陷阱

误区问题正确做法
盲目加索引索引过多影响写性能分析查询模式
**SELECT ***网络传输/内存浪费按需取字段
LIMIT 深分页扫描全表使用游标分页
OR 条件索引失效改用 UNION
函数操作列索引失效计算移到应用层

💡 分页优化对比

-- 低效深分页
SELECT * FROM orders ORDER BY id LIMIT 1000000, 10; -- 扫描1000010行-- 高效游标分页
SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10; -- 扫描10行

四、Explain 执行计划解密

💡 Explain 关键字段解读

字段含义优化目标
type访问类型至少达到 range
key实际使用索引避免 NULL
rows预估扫描行减少到1%
Extra附加信息避免 Using filesort

📊 执行计划表示例

idselect_typetabletypekeyrowsExtra
1SIMPLEusersrefidx_age100Using where

⚠️ 危险信号

  1. type=ALL:全表扫描
  2. Using temporary:临时表
  3. Using filesort:文件排序
  4. rows > 10000:大表扫描

五、联合索引优化实战

💡 最左前缀原则

联合索引 idx_a_b_c
有效查询
a=?
a=? AND b=?
a=? AND b=? AND c=?
无效查询
b=?
c=?
b=? AND c=?

⚙️ 案例:电商订单查询优化

​​问题 SQL​​:

SELECT * FROM orders 
WHERE user_id = 100 
AND status = 'completed'
AND create_time > '2023-01-01'
ORDER BY amount DESC;

​​优化前​​:

指标
执行时间2.3s
扫描行数120,000
索引NULL

​​优化方案​​:

-- 创建联合索引
ALTER TABLE orders ADD INDEX idx_user_status_time(user_id, status, create_time);-- 改写 SQL
SELECT * FROM orders 
WHERE user_id = 100 
AND status = 'completed'
AND create_time > '2023-01-01'
ORDER BY amount DESC; 
-- 注意:amount 排序需单独处理

​​优化后​​:

指标提升
执行时间0.05s46倍
扫描行数350342倍
索引idx_user_status_time

六、SQL 优化流程

🔄 优化四步法

未达标
达标
定位慢 SQL
分析执行计划
制定优化策略
验证效果
上线监控

⚙️ 优化策略优先级

  1. 索引优化:80% 问题解决方案
  2. SQL 改写:调整查询逻辑
  3. 表结构调整:分区/分表/归档
  4. 架构升级:读写分离/缓存

📈 优化效果对比

案例优化前优化后提升
订单查询1200ms25ms48倍
用户分页850ms8ms106倍
报表统计15s0.8s18倍

七、实战经验与建议

🛡️ 慢 SQL 预防体系

预防体系
开发规范
自动化审核
持续监控
禁止 SELECT *
索引设计规范
SQL 审核工具
慢日志告警

⚡️ 监控命令速查

-- 实时进程
SHOW FULL PROCESSLIST;-- 锁等待
SELECT * FROM sys.innodb_lock_waits;-- 索引统计
SHOW INDEX FROM orders;-- 表状态
SHOW TABLE STATUS LIKE 'orders';

📝 SQL 开发规范

  1. 禁止:SELECT * / 大事务 / 全表更新
  2. 必须:WHERE 条件索引 / LIMIT 限制
  3. 建议:事务 < 100ms / 单表 < 500w行
  4. 强制:线上 SQL 必须评审

八、总结

🏆 优化黄金法则

优化原则
最小扫描
最少传输
避免锁争用
索引覆盖
精简字段
短事务

📚 推荐工具清单

工具用途推荐场景
pt-query-digest慢日志分析定期巡检
sys schema性能视图实时监控
EXPLAIN FORMAT=JSON执行计划深度分析
Percona Toolkit运维套件专业DBA

​​数据驱动优化​​:没有指标不要调优
​​索引是把双刃剑​​:写成本需考量
​​简单即有效​​:复杂方案常是错的开始
记住:​​SQL 优化是 80% 的常识 + 20% 的深度​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92918.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92918.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92918.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中如何运用JWT用户认证

一、JWT概述JSON Web Token&#xff08;JWT&#xff09;是一种轻量级的身份认证机制&#xff0c;广泛应用于分布式系统中的用户认证。它通过紧凑的JSON格式存储用户身份信息&#xff0c;并使用数字签名确保信息的完整性和真实性。与传统的基于Session的认证相比&#xff0c;JWT…

Hibernate 使用详解

在现代的Java开发中&#xff0c;数据持久化是一个至关重要的环节。而在众多持久化框架中&#xff0c;Hibernate以其强大的功能和灵活性&#xff0c;成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法&#xff0c;希望能为广大开发者提供一些有…

【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)

基于 YOLO12 与 OpenCV 的实时点击目标跟踪系统 在计算机视觉领域&#xff0c;目标检测与跟踪是两个核心任务。本文将介绍一个结合 YOLO 目标检测模型与 OpenCV 跟踪算法的实时目标跟踪系统&#xff0c;该系统允许用户通过鼠标交互选择特定目标进行持续跟踪&#xff0c;支持多…

【数据库】 MySQL 表的操作详解

在 MySQL 数据库的日常开发与维护中&#xff0c;表的操作是最基础且最常用的部分。本文将从 创建表、查看表结构、修改表 以及 删除表 等方面进行详细讲解&#xff0c;并附上对应的 SQL 语句示例&#xff0c;方便在实际项目中直接应用。一、创建表 1.1 创建表语法 CREATE TABLE…

DiT: Transformer上的扩散模型

论文&#xff08;ICCV 2023&#xff09;&#xff1a;Scalable Diffusion Models with Transformers 代码和工程网页&#xff1a;https://www.wpeebles.com/DiT.html DiTs&#xff08;Diffusion Transformers&#xff09;是首个基于Transformer架构的扩散模型&#xff01;它在…

MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)

文章目录一、二叉查找树(BST)&#xff1a;不平衡二、平衡二叉树(AVL)&#xff1a;旋转耗时三、红黑树&#xff1a;树太高由一个例子总结索引的特点基于哈希表实现的哈希索引高效的查找方式&#xff1a;二分查找基于二分查找思想的二叉查找树升级版的BST树&#xff1a;AVL 树四、…

ESP32入门开发·VScode空白项目搭建·点亮一颗LED灯

目录 1. 环境搭建 2. 创建项目 3. 调试相关介绍 4. 代码编写 4.1 包含头文件 4.2 引脚配置 4.3 设置输出电平 4.4 延时函数 4.5 调试 1. 环境搭建 默认已经搭建好环境&#xff0c;如果未搭建好可参考&#xff1a; ESP32入门开发Windows平台下开发环境的搭建…

ONLYOFFICE AI 智能体上线!与编辑器、新的 AI 提供商等进行智能交互

ONLYOFFICE AI 插件​迎来重要更新&#xff0c;带来了新功能和更智能的交互体验。随着 AI 智能体&#xff08;现为测试版&#xff09;的上线、带来更多 AI 提供商支持以及其他新功能&#xff0c;AI 插件已经成为功能强大的文档智能助理。 关于 ONLYOFFICE ONLYOFFICE 文档是多…

【C++进阶学习】第十一弹——C++11(上)——右值引用和移动语义

前言&#xff1a; 前面我们已经将C的重点语法讲的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出来了很多新的语法&#xff0c;其中有一些作用还是非常大的&#xff0c;今天我们就先来学习其中一个很重要的点——右值引用以及它所扩展的移动定义 目录 一、左值引用和…

【IoTDB】363万点/秒写入!IoTDB凭何领跑工业时序数据库赛道?

【作者主页】Francek Chen 【专栏介绍】⌈⌈⌈大数据与数据库应用⌋⌋⌋ 大数据是规模庞大、类型多样且增长迅速的数据集合&#xff0c;需特殊技术处理分析以挖掘价值。数据库作为数据管理的关键工具&#xff0c;具备高效存储、精准查询与安全维护能力。二者紧密结合&#xff0…

IEEE 2025 | 重磅开源!SLAM框架用“法向量+LRU缓存”,将三维重建效率飙升72%!

一、前言 当前研究领域在基于扩散模型的文本到图像生成技术方面取得了显著进展&#xff0c;尤其在视觉条件控制方面。然而&#xff0c;现有方法&#xff08;如ControlNet&#xff09;在组合多个视觉条件时存在明显不足&#xff0c;主要表现为独立控制分支在去噪过程中容易引入…

无人机遥控器教练模式技术要点

一、技术要点1.控制权仲裁机制&#xff1a;核心功能&#xff1a;清晰定义主控权归属逻辑&#xff08;默认为学员&#xff0c;但教练随时可接管&#xff09;。切换方式&#xff1a;通常通过教练遥控器上的物理开关&#xff08;瞬时或锁定型&#xff09;或软件按钮触发。切换逻辑…

【跨服务器的数据自动化下载--安装公钥,免密下载】

跨服务器的数据自动化下载功能介绍&#xff1a;上代码&#xff1a;发现好久没写csdn了&#xff0c;说多了都是泪~~ 以后会更新一些自动化工作的脚本or 小tricks&#xff0c;欢迎交流。分享一个最近在业务上写的较为实用的自动化脚本&#xff0c;可以批量从远端服务器下载指定数…

C++-->stl: list的使用

前言list的认识list是可以在固定时间&#xff08;O&#xff08;1&#xff09;&#xff09;内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0…

本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕

1. 实现功能 M4-1 接入 whisper ollama qwen3:14b 总结字幕 自动下载视频元数据如果有字幕&#xff0c;只下载字幕使用 ollama 的 qwen3:14b 对字幕内容进行总结 2.运行效果 source /root/anaconda3/bin/activate ytdlp &#x1f50d; 正在提取视频元数据… &#x1f4dd; 正在…

《Linux运维总结:Shell脚本高级特性之变量间接调用》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、变量间接调用 在Shell脚本中&#xff0c;变量间接调用是一种高级特性&#xff0c;它允许你通过另一个变量的值来动态地访问…

ABP VNext + Akka.NET:高并发处理与分布式计算

ABP VNext Akka.NET&#xff1a;高并发处理与分布式计算 &#x1f680; 用 Actor 模型把高并发写入“分片→串行化”&#xff0c;把锁与竞态压力转回到代码层面的可控顺序处理&#xff1b;依托 Cluster.Sharding 横向扩容&#xff0c;Persistence 宕机可恢复&#xff0c;Strea…

[激光原理与应用-250]:理论 - 几何光学 - 透镜成像的优缺点,以及如克服缺点

透镜成像是光学系统中应用最广泛的技术&#xff0c;其通过折射原理将物体信息转换为图像&#xff0c;但存在像差、环境敏感等固有缺陷。以下是透镜成像的优缺点及针对性改进方案&#xff1a;一、透镜成像的核心优点高效集光能力透镜通过曲面设计将分散光线聚焦到一点&#xff0…

测试匠谈 | AI语音合成之大模型性能优化实践

「测试匠谈」是优测云服务平台倾心打造的内容专栏&#xff0c;汇集腾讯各大产品的顶尖技术大咖&#xff0c;为大家倾囊相授开发测试领域的知识技能与实践&#xff0c;让测试工作变得更加轻松高效。 本期嘉宾介绍 Soren&#xff0c;腾讯TEG技术事业群质量工程师&#xff0c;负责…

用天气预测理解分类算法-从出门看天气到逻辑回归

一、生活中的决策难题&#xff1a;周末郊游的「天气判断」 周末计划郊游时&#xff0c;你是不是总会打开天气预报反复确认&#xff1f;看到 "25℃、微风、无雨" 就兴奋收拾行李&#xff0c;看到 "35℃、暴雨" 就果断取消计划。这个判断过程&#xff0c;其…