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

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!

http://www.gsyq.cn/news/111691.html

相关文章:

  • [THUPC 2024 初赛] 一棵树
  • Linux入门(更新中...)
  • 三相异步电动机启保停正反转星三角控制电路及西门子200PLC与MCGS7.7联机程序(带注释和...
  • Ubuntu22.04安装postgresql16.8
  • 如何修复 Element Plus Table 在分页切换时滚动条不更新的问题
  • 水塔液位控制系统实战手记
  • OE 平台是什么?基于多来源数字内容管理需求形成的海外工具型平台
  • 新的spring boot3.x和spring-security6.x的流程
  • 西门子Wincc报表模版大全:多种模板积攒,视频讲解详解,SQL数据库应用实战
  • 从“水往低处流”到“逆流而上”:BFS搜索巧解太平洋大西洋水流问题
  • LobeChat能否实现AI生成季度报告?财务与业务总结自动化
  • CPS 信息物理系统:世界模型的基础与人工智能万物互联控制的实现​
  • java计算机毕业设计手机仓库管理系统 移动端库存智能管理平台的设计与实现 基于手机的仓储作业协同系统开发
  • 数字卡尺与几何魔法:聊聊那些藏在代码里的测量艺术
  • 创业与拓展必备!支持无限开号的洗车小程序系统源码
  • 主动配电网故障恢复的重构与孤岛划分模型 关键词:分布式电源 故障网络重构 主动配电网 孤岛划分...
  • COMSOL的多物理场仿真工具箱里藏着电池工程师的快乐密码。今天咱们不聊虚的,直接看几个实操案例。比如锂离子电池的热失控模拟,这个参数设置界面里藏着魔鬼细节
  • (一)系统介绍及后端框架构建
  • springboot数据上链FISCO BCOS
  • 【开源源码】基于 STM32智能温度监控系统 | 一个支持远程监控与告警的嵌入式实践项目
  • A06B-0236-B100伺服电机
  • 风光储并网发电系统仿真模型 共直流母线式风光储:风力发电+光伏发电+储能+三相逆变并网 ①光伏...
  • 新手友好!4组AI头像提示词模板,无需绘画基础也能出图
  • 执行 install.sh 报错 `env: ‘bash\r‘: No such file or directory` 怎么解决?
  • 洗车行业的多商户管理小程序源码系统 带完整的搭建部署教程
  • WER 2025世锦赛暨能力风暴教育机器人高峰论坛在沪举行
  • 按需购买Token计费模式上线,搭配LobeChat更划算
  • 在线免费夸克网盘解析网站不限速70MB/S - 在线工具使用
  • 从爬取到分析:使用 Pandas 处理头条问答数据
  • list 的cpp简单模拟实现