SQL优化实战:从30秒到1毫秒的性能提升

发布时间:2026/11/4 17:38:24

SQL优化实战:从30秒到1毫秒的性能提升 1. 从30秒到1毫秒一次SQL优化实战全记录上周排查线上慢查询时意外发现一个执行时间长达30秒的SQL语句。经过系列优化后最终将执行时间压缩到1毫秒以内。这个案例非常典型涉及子查询优化、索引策略、执行计划分析等核心知识点特别记录下完整优化过程。2. 问题场景还原2.1 数据库环境与表结构我们使用MySQL 5.6版本涉及三张核心表课程表CourseCREATE TABLE Course( c_id INT PRIMARY KEY, name VARCHAR(10) ) ENGINEInnoDB;数据量100条课程记录学生表StudentCREATE TABLE Student( s_id INT PRIMARY KEY, name VARCHAR(10) ) ENGINEInnoDB;数据量7万条学生记录成绩表SCCREATE TABLE SC( sc_id INT PRIMARY KEY, s_id INT, c_id INT, score INT, FOREIGN KEY (s_id) REFERENCES Student(s_id), FOREIGN KEY (c_id) REFERENCES Course(c_id) ) ENGINEInnoDB;数据量70万条成绩记录2.2 原始SQL与性能问题业务需求是查询语文考试c_id0得100分的学生信息原始SQL如下SELECT s.* FROM Student s WHERE s.s_id IN ( SELECT s_id FROM SC WHERE c_id 0 AND score 100 );执行时间30248.271秒约8.4小时3. 第一轮优化基础索引策略3.1 执行计划分析使用EXPLAIN查看执行计划EXPLAIN SELECT s.* FROM Student s WHERE s.s_id IN ( SELECT s_id FROM SC WHERE c_id 0 AND score 100 );执行计划显示两张表都使用全表扫描typeALL没有使用任何索引预估扫描行数Student表7万行SC表70万行3.2 添加单列索引在WHERE条件字段上创建索引CREATE INDEX idx_sc_c_id ON SC(c_id); CREATE INDEX idx_sc_score ON SC(score);优化后执行时间1.054秒性能提升约3万倍但1秒的响应时间对于线上服务仍不理想。4. 第二轮优化子查询重构4.1 分析优化后的执行计划查看优化后的实际执行SQL通过SHOW WARNINGSSELECT s.s_id, s.name FROM Student s WHERE in_optimizer( s.s_id, EXISTS( SELECT 1 FROM SC sc WHERE (sc.c_id 0) AND (sc.score 100) AND (CACHE(s.s_id) sc.s_id) ) )问题分析MySQL将IN子查询转换为EXISTS相关子查询执行顺序变为先遍历Student表再循环查询SC表总操作次数7万学生× 8满足条件的成绩≈ 56万次4.2 改为连接查询重构为JOIN形式SELECT s.* FROM Student s INNER JOIN SC sc ON sc.s_id s.s_id WHERE sc.c_id 0 AND sc.score 100;执行时间0.057秒4.3 强制先过滤后连接通过子查询确保先过滤SC表SELECT s.* FROM ( SELECT s_id FROM SC WHERE c_id 0 AND score 100 ) t INNER JOIN Student s ON t.s_id s.s_id;执行时间0.054秒5. 第三轮优化联合索引策略5.1 数据量增长后的性能回退当SC表数据增长到300万条时之前的优化SQL执行时间回升到0.061秒。分析发现c_id81的记录70001条score84的记录39425条c_id81 AND score84的记录897条5.2 创建联合索引删除单列索引创建(c_id, score)联合索引ALTER TABLE SC DROP INDEX idx_sc_c_id; ALTER TABLE SC DROP INDEX idx_sc_score; CREATE INDEX idx_sc_cid_score ON SC(c_id, score);优化后执行时间0.007秒6. 执行计划深度解析6.1 最优执行计划解读------------------------------------------------------------------------------------------------------ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | ------------------------------------------------------------------------------------------------------ | 1 | PRIMARY | derived2 | ALL | NULL | NULL | NULL | NULL | 897 | NULL | | 1 | PRIMARY | s | eq_ref | PRIMARY | PRIMARY | 4 | t.s_id | 1 | NULL | | 2 | DERIVED | sc | ref | idx_sc_cid_score | idx_sc_cid_score | 9 | const,const | 897 | Using index | ------------------------------------------------------------------------------------------------------关键点首先利用联合索引快速定位SC表中符合条件的897条记录通过主键关联Student表获取学生信息整个过程完全使用索引没有全表扫描7. 索引优化进阶技巧7.1 多列索引的最左前缀原则对于索引(c_id, score, s_id)WHERE c_id0→ 可用WHERE c_id0 AND score100→ 可用WHERE score100→ 不可用7.2 索引覆盖优化查询只返回索引包含的字段时无需回表SELECT c_id, score FROM SC WHERE c_id0 AND score100;执行时间0.003秒7.3 索引选择性原则建立索引前评估字段区分度SELECT COUNT(DISTINCT c_id)/COUNT(*) AS c_id_selectivity, COUNT(DISTINCT score)/COUNT(*) AS score_selectivity FROM SC;8. 实战经验总结子查询陷阱MySQL 5.6对IN子查询的优化仍不完善优先考虑JOIN重构索引策略联合索引比多个单列索引更高效区分度高的字段应放在联合索引左侧执行计划分析关注type列ALL→index→range→ref→eq_ref→const检查是否出现Using filesort或Using temporary数据量影响小数据量时索引效果不明显数据增长后索引策略需要重新评估9. 生产环境索引规范建立索引WHERE条件中的高频字段JOIN关联字段ORDER BY/GROUP BY字段避免索引区分度低的字段如性别频繁更新的字段索引维护定期分析慢查询日志使用pt-index-usage工具监控索引使用情况这个案例让我深刻体会到同样的SQL在不同数据量下可能表现出完全不同的性能特征。建议每季度对核心表进行索引review确保索引策略始终适应当前数据规模
延伸阅读

更多相关文章

2026/11/4 17:38:24

OpenClaw 2.0 Mac安装指南:M芯片与Intel芯片架构差异详解

前几周我把 OpenClaw 2.0 部署到自己那台 M 芯片的 MacBook Pro 上,前前后后折腾了半个晚上。主要卡点反而不是 Agent 本身,而是安装路径和它背后那套依赖链的架构兼容问题。过了两天又帮朋友在 Intel 芯片的 Mac mini 上装了一遍,结果踩了一…

2026/11/4 17:38:24

SAP系统审计方案设计:五域取证与可复现控制点实践

简介:面向SAP系统审计人员、内审与IT合规岗位的实务型审计程序清单,围绕系统安全、稳定与合规目标,梳理从组织架构、安全政策、应用架构图到问题跟踪记录、待实施增强清单、开发方法论与服务级别协议的取证与核查要点。内容按通用检查、设计与…

2026/11/4 17:33:23

codex接入中转站API无法生成图片:本地适配层排查与归一化方案

最近碰到一个挺典型的事:有朋友把 codex 的接口地址换成了第三方中转服务,聊天、补全、改代码都正常,唯独让他画张图,不是回一句"当前模型不支持图像生成",就是终端里吐半行链接然后卡死。他那套 key 拿去别…

2026/11/4 18:48:39

书签批量导入去重、自动备份与自建首页实践

书签这个东西,有点像家里的储物间。刚开始往里扔的时候都觉得“以后肯定用得上”,等到某天真正想找一份东西,翻半天翻不到,才发现里面塞满了三年前的快递盒和不知道哪来的塑料袋。我一个做前端的朋友上个月换了台机器,…

2026/11/4 18:48:39

工厂线上推广素材低成本制作与优化策略

1. 工厂线上推广的素材困境与破局思路去年帮一家东莞的灯具代工厂做线上转型时,老板老陈给我看了他们的产品图——昏暗的厂房里,灯具摆在包装纸箱上拍摄,背景还能看到半截扫把。这种素材直接导致他们的1688店铺点击率不到行业平均值的1/3。这…

2026/11/4 18:48:39

数据科学与大数据毕业设计创新选题指南

1. 项目背景与核心价值每年毕业季,数据科学与大数据技术专业的学生们最头疼的问题就是选题。一个好的毕业设计题目既要体现专业核心能力,又要具备创新性和可行性。作为带过7届毕业设计的导师,我见过太多学生在选题阶段浪费大量时间&#xff0…

2026/11/4 18:48:39

数据结构与算法分析C语言版解答手册:复杂度、递归与自测方法

简介:这份 PDF 是 Mark Allen Weiss《Data Structures and Algorithm Analysis in C》第二版的配套习题解答手册,面向学习数据结构与算法分析课程、希望对照课后练习查漏补缺的本科生和自学者。内容按教材章节展开,涵盖算法复杂度与大 O 分析…

2026/11/4 18:48:39

Excalidraw 白板 JSON 导入导出与配置持久化

周五下午四点半,你把一张三十多个节点的手绘架构图在浏览器里画完,顺手点了根烟回来,发现标签页被系统回收了。刷新之后,白色画布上空空如也,那种感觉比丢代码还难受——代码好歹还有 git,白板上的东西是真…

2026/11/4 18:43:37

电子书下载器怎么用?3步搞定合规文档导出与本地管理

1. 先搞清楚这类工具到底在解决什么问题聊“电子书下载器”这个话题之前,得先把一个前提说清楚:我下面讨论的所有内容,都建立在你有权访问、且平台允许离线保存的资源范围内。比如你自己上传的文档、开放授权的内容、平台本身提供的离线阅读功…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑