区分临时表、物化表、派生表

759 阅读2分钟

临时表

在执行SQL过程中,MySQL有时会借助临时表处理中间的结果,这时使用的临时表称为内部临时表,内部临时表对用户不可见,不能直接操作

另外用户可以通过create temporary table创建外部临时表,这时创建的临时表仅对当前会话可见,会话退出后临时表自动删除。 

本文主要探讨内部临时表

物化表

物化(Materialize)是MySQL优化器的一种优化子查询的手法,是指将子查询结果集中的记录保存到临时表的过程,存储子查询结果集的临时表称为物化表。

在下面几种场景会用到物化:

  • 对子查询进行半连接优化时:semi-join Meterialization execution strategy
  • 不能转化为半连接方式执行的不相关子查询:Materialization
  • 物化派生表

前面两种容易混淆,注意区分

  • semi-join Meterialization execution strategy,先物化,然后转换为semi-join,执行计划如下

image.png

  • Materialization,先将不相关子查询进行物化,然后根据外层条件在物化表中查找,仍然是子查询的方式执行,下面是通过optimizer_switch禁用了semijoin之后的执行计划

image.png

派生表

派生表是特指在from子句中的子查询的结果集

SELECT ... FROM (subquery) [AS] tbl_name ...

其中,[AS] tbl_name是必须的,因为from子句中每个表都必须有表名字

对于派生表,优化器有两种优化策略:

  • 合并到外层查询
  • 物化 --> 这个过程也就产生了物化表

例如,下面关闭优化器derived_merge的执行计划,派生表被物化

三者关系

MySQL在很多场景会使用到内部临时表,派生表和物化表属于其中的两个不同场景下不同的叫法