衍生表的优化:合并 | 具化
一、mysql优化器对于衍生表的优化处理可以从两方面进行:
将衍生表合并到外部查询
将衍生表具化为内部临时表
1、示例 1:
SELECT * FROM (SELECT * FROM t1) AS derived_t1;
衍生表 derived_t1 合并处理后,实际执行的查询类似如下:
2、示例 2:
衍生表 derived_t2 合并处理后,实际执行的查询类似如下:
如果是具化操作的话, derived_t1 和 derived_t2 会被作为独立的表来进行查询。
mysql 优化器会尽量避免去具化衍生表。
如果合并操作是的外部表超过61个,则优化器会选择具化表。
二、优化器关于衍生表中 order by 的处理:
1、在 sql 满足如下全部条件时,衍生表的 order by 会被放到外部查询延迟执行,反之,则会被忽略:
外部查询无分组、聚合操作。
外部查询没有使用 DISTINCT, HAVING 或 ORDER BY等操作。
外部查询只有衍生表这个唯一的查询源。
2、可以通过以下几种方式进行优化器的衍生表合并:
关闭derived_merge:mysql5.7默认是开启的。
子查询使用一些特定操作来组织优化器合并操作:
DISTINCT
GROUP BY
HAVING
LIMIT
Subqueries in the select list
Assignments to user variables