MySQL SQL 优化实战:慢查询优化,从定位到解决

📅 2026/7/18 4:47:10
MySQL SQL 优化实战:慢查询优化,从定位到解决
前言线上数据库接口超时、CPU 打满、页面加载缓慢绝大多数根源是慢 SQL。很多新手只会事后改 SQL不会主动定位慢查询。本文完整流程开启慢查询日志→定位慢 SQL→EXPLAIN 分析执行计划→针对性优化一套完整实战流程。一、开启慢查询日志定位慢 SQL 第一步慢查询日志会记录执行时间超过指定阈值的 SQL用于抓低效语句。1. 临时生效重启失效-- 开启慢日志 SET slow_query_log 1; -- 阈值超过1秒视为慢SQL SET long_query_time 1; -- 日志存储文件 SET slow_query_log_file /var/lib/mysql/slow.log; -- 记录无索引全表扫描SQL SET log_queries_not_using_indexes 1;2. 永久配置 my.cnfslow_query_log 1 long_query_time 1 slow_query_log_file /var/lib/mysql/slow.log log_queries_not_using_indexes 13. 日志分析工具 mysqldumpslow# 统计访问次数最多、耗时最长的慢SQL mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log参数说明-s t按总耗时排序-s c按执行次数排序-t 10输出 Top10 条慢 SQL二、拿到慢 SQL 后EXPLAIN 分析执行计划拿到慢语句在 SQL 前加 EXPLAIN 查看执行计划核心观察 4 个字段typeALL 全表扫描必须优化最优为 ref/rangekeyNULL 代表未命中索引rows预估扫描行数数值越大越慢Extra出现 Using filesort、Using temporary 代表严重性能损耗三、慢 SQL 常见问题 对应优化方案全表扫描 typeALL原因无索引、索引失效优化给 WHERE/ORDER BY/GROUP BY 字段建索引规避索引失效语法。Using filesort 文件排序原因ORDER BY 字段无索引优化排序字段加入复合索引。Using temporary 临时表原因GROUP BY/DISTINCT 无索引优化分组字段建索引简化分组逻辑。LIMIT 超大偏移卡顿原因偏移量过大扫描大量数据优化主键分页、子查询分页。多表 JOIN 笛卡尔积原因缺少 ON 关联条件、关联字段无索引优化关联字段加索引精简关联表。四、完整优化实战流程开启慢查询日志采集线上慢 SQL使用 mysqldumpslow 筛选高频、高耗时语句EXPLAIN 分析执行计划定位索引 / 语法问题调整索引、改写 SQL压测验证耗时下降上线持续监控慢日志定期巡检。五、日常监控规范生产阈值建议设置 1 秒复杂报表可放宽至 3 秒定时清理慢日志避免磁盘占满配合监控平台告警出现大量慢 SQL 及时处理。