SQL查询优化实战:一个慢查询从12秒到0.03秒的全过程
在实际开发中,你一定遇到过这样的场景:上线前测试一切正常,数据量一上来,页面直接转圈转到你怀疑人生。一个查询慢了几秒,用户就关掉了页面;慢了十几秒,用户就卸载了App。SQL优化不是什么高深莫测的玄学,它是每个后端开发者必须掌握的基本功。今天这篇文章,我会用一个真实案例,把SQL查询优化的完整思路、工具使用、索引策略一步一步拆解给你看。
一、问题背景:一条让人崩溃的慢查询
事情要从一次线上告警说起。某电商平台的订单列表接口,响应时间突然从200ms飙升到了12秒,用户投诉量在半小时内翻了三倍。
拿到慢查询日志后,定位到了这条SQL:
sql
SELECT
o.id, o.order_no, o.amount, o.status,
u.nickname, u.phone
FROM orders o
LEFT JOIN users u ON o.user_id = u.id
WHERE o.status IN (1, 2, 3)
AND o.created_at >= '2026-05-01 00:00:00'
ORDER BY o.created_at DESC
LIMIT 20;
orders表数据量大约800万行,users表大约120万行。执行这条查询,在没有任何优化的情况下,耗时12.3秒。
很多人第一反应是"加索引",但加在哪里、怎么加,这里面的门道非常多。
二、第一步:用Explain看清真相
优化SQL的第一件事,不是改代码,而是用Explain看执行计划。
sql
EXPLAIN SELECT
o.id, o.order_no, o.amount, o.status,
u.nickname, u.phone
FROM orders o
LEFT JOIN users u ON o.user_id = u.id
WHERE o.status IN (1, 2, 3)