总结:
在 MySQL 5.7 中,如果 WHERE 只作用于主表,但 JOIN 和 ORDER BY 很重,
就应当显式地缩小驱动表;
在 MySQL 8.0 中,优化器可能自动完成,但不能盲目信任。
问题描述:
sql
//优化前
select * from
a
left join b on b.b=a.b left join... where a.id in (1,2...) order by d.number;
//优化后
select * from
(select * from a where a.id in (1,2,3...)) t
left join b ... order by d.number;
在 MySQL 8.0 中,优化器相比 5.7 有几项关键增强:
1.更积极的 WHERE 条件下推(Predicate Pushdown)
2.更智能的 JOIN 顺序重排
3.派生表(子查询)可被自动合并(Derived Merge)
4.更成熟的 Cost-Based Optimizer
👉 MySQL 8.0 很可能自动把过滤提前到 JOIN 之前
但要强调的边界条件(很重要) ,以下情况 8.0 也未必能完全自动优化:
1.JOIN 结构极其复杂(多层 LEFT JOIN)
2.WHERE 中混入了 b / c 的条件
3.ORDER BY / GROUP BY 过于复杂
4.存在函数、隐式类型转换
5.统计信息不准确
最后 如果sql已经这样优化,那么在代码层面可以去掉分批查询,基本逻辑都是类似的。
完结撒花~