临时表
在执行SQL过程中,MySQL有时会借助临时表处理中间的结果,这时使用的临时表称为内部临时表,内部临时表对用户不可见,不能直接操作
另外用户可以通过create temporary table创建外部临时表,这时创建的临时表仅对当前会话可见,会话退出后临时表自动删除。
本文主要探讨内部临时表
物化表
物化(Materialize)是MySQL优化器的一种优化子查询的手法,是指将子查询结果集中的记录保存到临时表的过程,存储子查询结果集的临时表称为物化表。
在下面几种场景会用到物化:
- 对子查询进行半连接优化时:semi-join Meterialization execution strategy
- 不能转化为半连接方式执行的不相关子查询:Materialization
- 物化派生表
前面两种容易混淆,注意区分
- semi-join Meterialization execution strategy,先物化,然后转换为semi-join,执行计划如下
- Materialization,先将不相关子查询进行物化,然后根据外层条件在物化表中查找,仍然是子查询的方式执行,下面是通过optimizer_switch禁用了semijoin之后的执行计划
派生表
派生表是特指在from子句中的子查询的结果集
SELECT ... FROM (subquery) [AS] tbl_name ...
其中,[AS] tbl_name是必须的,因为from子句中每个表都必须有表名字
对于派生表,优化器有两种优化策略:
- 合并到外层查询
- 物化 --> 这个过程也就产生了物化表
例如,下面关闭优化器derived_merge的执行计划,派生表被物化
三者关系
MySQL在很多场景会使用到内部临时表,派生表和物化表属于其中的两个不同场景下不同的叫法