优化器使用实体化,使更有效的子查询处理。实体化加速查询执行通过生成子查询的结果作为一个临时表,通常在内存中。第一次MySQL需要子查询的结果,结果到一个临时表实现。任何后续的结果是需要时间的,MySQL再次是指临时表。优化器可以索引表和一个哈希索引查找快捷、成本低廉。索引包含独特的值来消除重复,使表较小。
子查询实体化使用一个内存临时表在可能的情况下,回落到磁盘上的存储,如果表变得太大。看到部分8.4.4,“内部临时表中使用MySQL”。
如果不使用实体化,优化器有时重写noncorrelated子查询相关子查询。例如,下面的在
子查询是noncorrelated (where_condition
仅涉及列t2
而不是t1
):
SELECT * FROM t1 t1的地方。在(选择t2。b从t2where_condition);
优化器可能会把这个作为一个存在
相关子查询:
SELECT * FROM t1(选择t2存在的地方。b从t2where_condition和t1.a = t2.b);
使用临时表子查询实体化避免重写和可以执行子查询等只有一次而不是一次每一行的外部查询。
子查询中使用实体化MySQL,optimizer_switch
系统变量物质化
标志必须启用。(见部分8.9.2,“可切换的优化”)。与物质化
启用标志,实体化适用于子查询谓词,出现在任何地方(在选择列表中,在哪里
,在
,集团
,有
,或命令
)的谓词分为这些用例:
谓词这种形式,在没有外部表情
oe_i
或内部表达式ie_i
可以为空。N
是1或更大。(oe_1,oe_2、……oe_N(选择)[不]ie_1,i_2、……ie_N…)
谓词这种形式,当有一个外表达式
oe
和内心的表达即
。表达式可以可以为空。oe(不)(选择即…)
谓语是
在
或不是在
和的结果未知的
(零
)由于具有同样的意义假
。
下面的例子说明了等效的要求未知的
和假
谓词评价影响是否可以使用子查询实体化。假设where_condition
包括列只从t2
而不是t1
所以,子查询是noncorrelated。
该查询主题具体化:
SELECT * FROM t1 t1的地方。在(选择t2。b从t2where_condition);
在这里,它并不重要在
谓词返回未知的
或假
。无论哪种方式,行t1
不包括在查询结果。
一个例子,子查询实体化不使用以下查询,t2.b
是一个可以为空的列:
选择从t1 * (t1.a t1.b)(选择t2.a, t2。b从t2where_condition);
以下限制适用于使用子查询具体化:
内在和外在表达式的类型必须匹配。例如,优化器可以使用物化如果两个表达式都是整数或小数,但不能如果一个表达式是整数,另一个是小数。
内部表达式不能
团
。
使用解释
与查询优化器使用子查询是否提供了一些迹象具体化:
在MySQL 8.0.21后来,MySQL文档还可以使用子查询实体化更新
或删除
声明使用(不)
或(不)存在
子查询谓词,声明不使用命令
或限制
,子查询实体化由优化器提示或者是允许的optimizer_switch
设置。