10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 42.0 mb
PDF (A4)- 42.1 mb
手册页(TGZ)- 266.5 kb
手册页(邮政编码)- 376.2 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册摘录

与实体化8.2.2.2优化子查询

优化器使用实体化,使更有效的子查询处理。实体化加速查询执行通过生成子查询的结果作为一个临时表,通常在内存中。第一次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);

以下限制适用于使用子查询具体化:

  • 内在和外在表达式的类型必须匹配。例如,优化器可以使用物化如果两个表达式都是整数或小数,但不能如果一个表达式是整数,另一个是小数。

  • 内部表达式不能

使用解释与查询优化器使用子查询是否提供了一些迹象具体化:

  • 查询执行相比,不使用实体化,select_type可能会改变的相关子查询子查询。这表明,子查询,每执行一次外,物化使子查询只执行一次。

  • 解释后输出,显示的文本显示警告包括实现materialized-subquery

在MySQL 8.0.21后来,MySQL文档还可以使用子查询实体化更新删除声明使用(不)(不)存在子查询谓词,声明不使用命令限制,子查询实体化由优化器提示或者是允许的optimizer_switch设置。