如何优化多表查询sql?
第一步:诊断与分析 —— 知己知彼,百战不殆
在优化之前,永远不要猜测。必须使用工具找到瓶颈。
1.使用 EXPLAIN 或 EXPLAIN ANALYZE
这是最重要的步骤。执行计划会告诉你:
1.表的连接顺序:数据库先访问哪张表,后访问哪张表。
2.连接类型:这是性能的关键。
system / const:性能最佳,通过主键或唯一索引一次就找到。
eq_ref:理想的多表连接类型,通常使用主键或唯一索引进行关联。
ref:使用普通索引进行关联,性能很好。
range:索引范围扫描。
index:全索引扫描。
ALL:全表扫描,需要重点关注和优化的对象。
额外信息:关注 Using filesort(需要额外排序)和 Using temporary(使用了临时表),这些都是性能杀手。
第二步:核心优化策略
策略一:确保索引被正确使用
这是优化多表查询最有效的手段。
为连接条件建立索引:ON 子句中的列必须有索引。例如:
SELECT * FROM orders o
JOIN users u ON o.user_id = u.id; -- 确保 `o.user_id` 和 `u.id` 都有索引
驱动表(通常是数据量小的表,或先访问的表)的连接键索引至关重要。
被驱动表的连接键必须有索引,否则会对该表进行全表扫描(Nested-Loop Join下)。
为 WHERE 子句建立索引:连接前的过滤条件能极大减少参与连接的数据量。
SELECT * FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.status = 