首页/数据/SQL 速查/派生表合并与物化(derived_merge)
性能与执行计划72 条

派生表合并与物化(derived_merge)

MySQL 5.7+ 会把 FROM 子查询合并进外层查询(受阻时物化成临时表):用 EXPLAIN 辨别两种形态。

SQL 速查数据更新于 2026-10-12

示例

示例
-- 合并形态:外层条件下推到派生表内部
EXPLAIN SELECT *
FROM (SELECT * FROM orders WHERE user_id = 100) t
WHERE t.status = 'paid';
-- 表名为 <derived2>;出现独立物化行与临时表则说明走了物化

-- 对比:强制不合并
EXPLAIN SELECT /*+ NO_MERGE(t) */ *
FROM (SELECT * FROM orders WHERE user_id = 100) t
WHERE t.status = 'paid';
合并条件无聚合、DISTINCT、GROUP BY、LIMIT、UNION、窗口函数等阻止合并的结构
开关optimizer_switch 中 derived_merge=on 为默认;可会话级关闭做对比
8.0.22+物化派生表支持条件下推(derived condition pushdown),减少物化数据量

易错点

  • 把派生表当必然物化:默认会合并并把条件下推,以 EXPLAIN 输出为判断依据
  • 对聚合类子查询期待合并:聚合会触发物化,需要从子查询设计上减少中间结果

数据来源与参考

  • MySQL 8.0 Reference Manual · Derived Tables
  • MySQL 8.0 Reference Manual · Optimizer Hints
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌