查询优化往往是 MySQL 性能优化中最先着手的部分,因为大多数性能问题最终都会落到 SQL 执行效率上。
优化 SQL 的第一步不是改写,而是分析。
最常见的方法是使用:
EXPLAIN SELECT * FROM user WHERE city = '上海';EXPLAIN 可以帮助我们了解:
- 是否使用了索引
- 扫描了多少行
- 连接顺序是否合理
- 是否出现了全表扫描
没有索引时,MySQL 可能需要扫描整张表; 有合适索引时,则可以更快定位记录。
例如:
SELECT *
FROM user
WHERE mobile = '13800000001';如果 mobile 上建立了索引,查询效率通常会明显提高。
索引通常更适合以下场景:
- 精确匹配
- 范围查询
- 排序和分组
- 连接字段匹配
例如:
SELECT *
FROM orders
WHERE user_id = 1
ORDER BY created_at DESC;如果 user_id 和 created_at 的使用模式稳定,就值得考虑针对性索引设计。
某些子查询执行效率较低时,可以考虑:
- 改写为连接查询
- 通过索引提升子查询效率
- 避免不必要的嵌套层级
例如某些 IN (子查询) 或 EXISTS 查询,在数据量较大时就需要特别关注执行计划。
优化查询的核心是:先分析,再改写,最后验证。高频慢 SQL 的优化收益通常远高于零散小优化。