总结:
在 MySQL 5.7 中,如果 WHERE 只作用于主表,但 JOIN 和 ORDER BY 很重,
就应当显式地缩小驱动表;
在 MySQL 8.0 中,优化器可能自动完成,但不能盲目信任。
问题描述:
//优化前select*fromaleftjoinbonb.b=a.bleftjoin...wherea.idin(1,2...)orderbyd.number;//优化后select*from(select*fromawherea.idin(1,2,3...))tleftjoinb...orderbyd.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已经这样优化,那么在代码层面可以去掉分批查询,基本逻辑都是类似的。
完结撒花~