SQL 调优全解:从 20 秒到 200 ms 的 6 步实战笔记(附脚本)

一、阅读指引

  1. 不会看执行计划 → 跳第 3 段

  2. 索引失效/全表扫描 → 看第 4 段

  3. 千万级分页卡顿 → 看第 5 段

  4. 想直接抄代码 → 第 8 段有下载链接

二、测试环境

MySQL 8.0.34,16C64G,SSD;订单表 500w,明细表 2000w,脚本见第 8 段。

三、慢查询现场(20.3s→0.2s)

SQL:近 30 天已支付订单明细

SELECT o.order_id, o.user_id, d.goods_name, d.price

FROM orders o JOIN order_detail d ON o.order_id = d.order_id

WHERE o.status = 2 AND o.pay_time >= DATE_SUB(NOW(), INTERVAL 30 DAY);

EXPLAIN 结果:orders 表 type=ALL,rows≈500w,全程全表扫描。

四、索引补齐(一步降到 8.5s)

ALTER TABLE orders ADD INDEX idx_status_paytime (status, pay_time);

原则:等值放左,范围放右。再执行 type=range,rows≈60w。

五、覆盖索引 + 延迟关联(深分页通用,再降到 0.2s)

Step1:先拿主键(覆盖索引)

SELECT order_id

FROM orders

WHERE status = 2 AND pay_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)

ORDER BY pay_time DESC LIMIT 1000000,20;

Step2:再回表 JOIN 明细

SELECT o.order_id, o.user_id, d.goods_name, d.price

FROM orders o JOIN order_detail d ON o.order_id = d.order_id

WHERE o.order_id IN (Step1 结果);

Step1 完全走索引不回表,Step2 只回表 20 行。

六、压测对比

原始:20.3s,扫描 500w 行

加索引:8.5s,扫描 60w 行

覆盖+延迟:0.2s,扫描 20 行

七、联合索引 10 条军规(速查表)

  1. 等值放左,范围放右;like '%xx' 放最右

  2. 禁止对索引列写函数(用区间代替 DATE())

  3. OR 拆 UNION,或建合并索引

  4. 区分度 <10% 不单独建索引

  5. 单表索引 ≤6 个

  6. 长字符串用前缀索引 url(30)

  7. ORDER BY 字段放联合索引尾部

  8. 覆盖索引优先,减少回表

  9. 深分页用延迟关联

  10. 亿级表优先分区+局部索引

八、一键复现脚本

表结构 + 500w 测试数据

wget https://gist.github.com/yourname/abc123/raw/init.sql

mysql -uroot -p < init.sql

九、一键巡检脚本

慢查询 TOP10:

SELECT sql_text, exec_count, avg_timer_wait/1e12 AS avg_sec

FROM performance_schema.events_statements_summary_by_digest

ORDER BY avg_timer_wait DESC LIMIT 10;

从未使用的索引:

SELECT * FROM sys.schema_unused_indexes;

十、口诀总结

"索引覆盖先,延迟关联深,执行计划看 type,千万分页也飞。"

收藏本文,下次慢查询直接照抄即可。欢迎在评论区晒出你的"秒优化"SQL!

相关推荐
creator_Li14 小时前
Kafka 全面技术笔记
笔记·学习·kafka
cyber_两只龙宝14 小时前
【Oracle】Oracle之DQL中SELECT的基础使用
linux·运维·服务器·数据库·云原生·oracle
老苏畅谈运维14 小时前
Oracle 在线表重定义:将非分区表转换为分区表的最佳实践
数据库·oracle
treacle田14 小时前
达梦数据库-达梦数据库中link链接访问oracle 19c/11g-记录总结
数据库·oracle·达梦 link访问oracle
萌兰三太子14 小时前
RAG 向量数据库设计指南:从入门到生产
数据库·oracle
TDengine (老段)15 小时前
中原油田引入时序数据库 TDengine:写入性能提升、存储成本下降 85%
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
智者知已应修善业15 小时前
【CD4022八进制计数器脉冲分配器】2023-5-31
驱动开发·经验分享·笔记·硬件架构·硬件工程
IT邦德15 小时前
Oracle 26ai搭建ADG Far Sync日志备库
数据库·oracle
Crazy CodeCrafter15 小时前
现在做服装,实体和电商怎么选?
大数据·数据库·人工智能·微信·开源软件·零售
一江寒逸15 小时前
零基础从入门到精通MongoDB(下篇):进阶精通篇——吃透高级查询、事务、索引优化与集群架构,成为MongoDB实战高手
数据库·mongodb·架构