MySQL里那些SQL优化的步骤和技巧,边做边学其实挺实用的分享
- 问答
- 2026-01-19 10:25:04
- 2
今天咱们不聊那些高大上的理论,就说说在实际工作中,怎么一步步地把一条慢SQL给收拾服帖了,这事儿就像医生看病,得先诊断,再开药,最后复查,以下就是我结合自己踩过的坑和一些实战经验(参考自《高性能MySQL》和一些技术博客的普遍观点)总结出来的“望闻问切”流程。
第一步:发现问题,抓住元凶
优化不能靠猜,你得先知道哪条SQL有问题,通常有这么几种方式:
- 慢查询日志: 这是最直接的工具,在MySQL的配置文件里(比如my.cnf),你可以设置一个时间阈值,比如
long_query_time = 2,意思是执行时间超过2秒的SQL都会被记录下来,定期去翻看这个日志,就能找到那些“拖后腿”的查询,这是最经典的排查方法。 - 数据库监控工具: 现在很多云数据库或者第三方工具(如Percona Monitoring and Management)都能图形化地展示哪些SQL消耗了最多的资源(CPU、IO),一目了然。
- 应用程序反馈: 有时候用户会直接抱怨“这个页面好慢”,根据反馈去定位对应的SQL也是一种方式。
找到目标SQL后,别急着改,先把它原样拿出来。
第二步:深入分析,看懂执行计划
拿到慢SQL后,最核心的一步就是看它的“执行计划”(Explain Plan),在执行SQL语句前,加上EXPLAIN关键字,比如EXPLAIN SELECT * FROM users WHERE name = '张三';。

MySQL会告诉你它打算怎么执行这条语句,但不会真正去执行,这里面的信息量很大,我们重点关注几项:
- type列: 这是访问类型,从好到坏大概是:
system > const > eq_ref > ref > range > index > ALL,我们最要避免的就是ALL,这代表全表扫描,也就是数据库要把整张表的数据一行行翻个遍,数据量一大肯定慢,理想情况是达到ref或range。 - key列: 显示MySQL实际决定使用的索引,如果这一列是
NULL,那很可能就是没用到索引,需要警惕。 - rows列: MySQL预估为了找到需要的行,要扫描多少行数据,这个数字当然是越小越好。
- Extra列: 这里会有很多额外信息,如果出现
Using filesort(需要额外排序)或者Using temporary(需要创建临时表),通常意味着性能瓶颈。
通过看执行计划,你就能大概知道慢的原因了:是不是没走索引?是不是走了错的索引?是不是有复杂的排序或临时表?
第三步:动手优化,对症下药
分析出原因后,就可以开始动手了,常见的技巧有:

- 为字段加索引: 这是最立竿见影的优化手段。
WHERE条件里经常用到的字段、JOIN连接用的字段、ORDER BY排序的字段,都考虑加上索引,但索引不是越多越好,因为它会影响写操作(增删改)的速度,并且占用空间。 - 优化SQL语句的写法:
- 只取需要的列: 坚决不用
SELECT *,需要什么字段就写什么字段,特别是TEXT、BLOB这类大字段,无故查询它们会带来巨大开销。 - 善用LIMIT: 分页查询时,一定要用
LIMIT来限制返回的行数。 - 避免在索引列上做计算或函数操作: 比如
WHERE YEAR(create_time) = 2023会导致索引失效,应该写成WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'。 - 连接查询(JOIN)代替子查询: 在大多数情况下,MySQL对JOIN的优化要好于子查询,这不是绝对的,有时候需要对比执行计划。
- 注意IN和EXISTS的使用: 如果子查询结果集小,外表大,用
EXISTS效率高;如果子查询结果集大,外表小,用IN效率高,这个也需要实际测试。
- 只取需要的列: 坚决不用
- 设计层面的优化:
- 适度冗余: 有时候为了避免多表关联查询,可以在主表里冗余一些经常要查询的从表字段,用空间换时间。
- 拆分大表: 对于数据量极大的表,可以考虑做分区表(Partitioning)或者分库分表(Sharding),但这属于架构级优化,复杂度较高。
第四步:验证效果,持续观察
改完之后,千万别以为就万事大吉了,一定要再次使用EXPLAIN查看新的执行计划,确认索引是否正确使用,扫描行数是否减少,在测试环境或者业务低峰期,实际执行一下优化后的SQL,看看速度是否提升,继续通过慢查询日志监控一段时间,确保优化是稳定有效的。
边做边学的实用心态
SQL优化是一个实践性极强的技能,光看是没用的,我的建议是:
- 从小处着手: 先拿一两条最影响业务的慢SQL开刀,体验完整的优化流程,建立信心。
- 大胆尝试,小心验证: 加个索引,改下SQL写法,成本并不高,但每次改动前都要用
EXPLAIN预测,改动后都要实测效果。 - 理解原理,而非死记硬背: 为什么要避免
SELECT *?为什么索引列不能加函数?理解了底层原理(比如索引的B+树结构),你就能举一反三,而不是机械地套用规则。
SQL优化就是一个不断发现问题、分析原因、尝试解决、验证效果的正向循环,做得多了,自然就有感觉了,希望这些实实在在的步骤和技巧对你有帮助。
本文由符海莹于2026-01-19发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/83610.html
