暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 8.2.2.5派生条件下推优化

原创 由迪 2021-04-20
983

MySQL 8.0.22和更高版本支持合格条件子查询的派生条件下推。对于诸如之类的查询,在很多情况下都可以将外部 条件下推到派生表,在这种情况下结果为 。如果无法将派生表合并到外部查询中(例如,如果派生表使用聚合),则将外部条件下推到派生表应会减少需要处理的行数,从而加快执行的速度。询问。 SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > *constant*``WHERE``SELECT * FROM (SELECT i, j FROM t1 WHERE i > *constant*) AS dt``WHERE

笔记

在MySQL 8.0.22之前,如果实现了一个派生表但没有合并它,则MySQL实现了整个表,然后用条件限定所有结果行 WHERE。如果未启用派生条件下推或由于某些其他原因而无法采用派生条件下推,则仍然是这种情况。

WHERE在以下情况下,可以将 外部条件下推到派生的物化表中:

  • 当派生表不使用聚合或窗口函数时,WHERE可以将外部条件直接推到该表。这包括 WHERE具有接合多个谓词条件ANDOR或两者。

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

  • 当派生表具有GROUP BY 和不使用窗口函数时,可以将WHERE引用一个或多个不属于的列的外部 条件GROUP BY作为HAVING条件下推到派生表 。

    例如,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

  • 当派生表使用aGROUP BY 并且外部WHERE 条件中的GROUP BY列是列时,WHERE引用这些列的 条件可以直接向下推到派生表中。

    例如,查询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

    如果外部WHERE 条件的谓词引用列是的一部分,而外部条件的谓词引用列GROUP BY不是,则前一种类型的谓词作为WHERE条件下推,而后一种类型的谓词作为 条件下推HAVING 。例如,在查询中SELECT * FROM (SELECT i, j, SUM(k) AS sum FROM t1 GROUP BY i,j) AS dt WHERE i > 10 AND sum > 100i > 10外部 WHERE子句中的谓词引用一 GROUP BY列,而该谓词 sum > 100不引用任何列。 GROUP BY柱子。因此,派生表下推优化导致查询以类似于此处所示方式的方式重写:

    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 标志(在此版本中添加)设置为 on,这是默认设置。如果通过禁用了此优化,则 optimizer_switch可以使用DERIVED_CONDITION_PUSHDOWN 优化器提示针对特定查询启用该 优化。要禁用给定查询的NO_DERIVED_CONDITION_PUSHDOWN 优化,请使用 优化器提示。

以下限制和限制适用于派生表条件下推式优化:

  • 如果派生表包含,则不能使用优化UNION
  • 派生表不能使用LIMIT 子句。
  • 包含子查询的条件无法下推。
  • 如果派生表是外部联接的内部表,则不能使用优化。
  • 如果物化派生表是公用表表达式,则如果多次引用该条件,则不会将条件下推到该表。
  • 如果条件的形式为,则可以下推使用参数的条件 *derived_column* > ?。如果外部WHERE条件中的派生列 是?基础派生表中具有a的表达式,则无法下推该条件。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论