10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

8.2.2.5导出条件下推优化

MySQL 8.0.22及其后续版本支持符合条件的子查询的派生条件下推。查询,例如SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i >常数在许多情况下,向外推是可能的在哪里条件转移到派生表,在这种情况下将导致SELECT * FROM (SELECT i, j FROM t1 WHERE i >常数), dt.当派生表不能合并到外部查询时(例如,如果派生表使用聚合),则推入外部查询在哪里条件下到派生表应该会减少需要处理的行数,从而加快查询的执行速度。

请注意

在MySQL 8.0.22之前,如果派生表被物化但没有合并,MySQL将物化整个表,然后使用在哪里条件。如果派生条件下推未启用,或者由于其他原因无法使用,仍然会出现这种情况。

在哪里在以下情况下,条件可以下推到派生物化表:

  • 当派生表不使用聚合或窗口函数时,外部在哪里条件可以直接推到它。这包括在哪里连接多个谓词的条件,或两者兼而有之。

    例如,查询SELECT * FROM (SELECT f1, f2 FROM t1) AS dt WHERE f1 < 3 AND f2 >是重写为SELECT f1, f2 FROM (SELECT f1, f2 FROM t1 WHERE f1 < 3 AND f2 > 11) AS dt

  • 当派生表具有集团并且不使用窗口函数,外置在哪里对象的一个或多个列引用的条件集团可以下推到派生表中作为条件。

    例如,SELECT * FROM (SELECT i, j, SUM(k) AS SUM FROM t1 GROUP BY i, j) AS dt WHERE SUM > 100重写后的派生条件下推为SELECT * FROM (SELECT i, j, SUM(k) AS SUM FROM t1 GROUP BY i, j HAVING SUM > 100) AS dt

  • 当派生表使用集团还有外面的柱子在哪里条件是集团列,在哪里引用这些列的条件可以直接下推到派生表。

    例如,查询SELECT * FROM (SELECT i,j, SUM(k) AS SUM FROM t1 GROUP BY i,j) AS dt WHERE i > 10是重写为SELECT * FROM (SELECT i,j, SUM(k) AS SUM FROM t1 WHERE i > 10 GROUP BY i,j) AS dt

    如果外面的在哪里条件具有引用列的谓词,列是集团与引用非列的谓词一样,前一种类型的谓词下推为在哪里条件,而后一种类型下推为条件。例如,在查询中SELECT * FROM (SELECT i,j, SUM(k) AS SUM FROM t1 GROUP BY i,j) AS dt WHERE i > 10 AND SUM > 100,谓词我> 10在外面的在哪里引用一个条款集团列,而谓词金额> 100没有引用任何集团列。因此,派生表下推优化导致查询以类似于下面所示的方式重写:

    SELECT * FROM (SELECT i, j, SUM(k) AS SUM FROM t1 WHERE i > 10 GROUP BY i, j HAVING SUM > 100) AS dt;

要启用派生条件下推,请使用optimizer_switch系统变量的derived_condition_pushdown标志(在此版本中添加)必须设置为,这是默认设置。如果此优化被禁用optimizer_switch,可以为特定查询启用它DERIVED_CONDITION_PUSHDOWN优化器提示。要禁用给定查询的优化,请使用NO_DERIVED_CONDITION_PUSHDOWN优化器提示。

导出表条件下推优化有以下限制和限制:

  • 如果派生表包含联盟

  • 派生表不能使用限制条款。

  • 包含子查询的条件不能下推。

  • 如果派生表是外部连接的内部表,则不能使用此优化。

  • 如果物化派生表是公共表表达式,如果多次引用它,则不会将条件下推到它。

  • 如果条件为该形式,则可以将使用参数的条件下推derived_column>吗?.如果派生列位于外层在哪里条件是一个表达式?在基础派生表中,无法下推此条件。