8.9.2 可切换优化

  • (默认)

    从 MySQL 8.0.21 开始,优化器在许多情况下能够将 、 、 或 子句中的标量子查询转换 为派生 表 上的左外连接。(根据派生表的可空性,这有时可以进一步简化为内部联接。)这可以用于满足以下条件的子查询:

    • 子查询不使用任何非确定性函数,例如 .

    • 子查询不是or 子查询,可以重写为使用 or

    • 父查询不设置用户变量,因为重写它可能会影响执行顺序,如果在同一查询中多次访问该变量,这可能会导致意外结果。

    • 子查询不应相关,即它不应引用外部查询中表中的列,或包含在外部查询中计算的聚合。

    在 MySQL 8.0.22 之前,子查询不能包含 子句。

    此优化还可以应用于表子查询,该子查询是、、 或 的参数, 不包含 .

    此标志的默认值为 ,因为在大多数情况下,启用此优化不会产生任何明显的性能改进(在许多情况下甚至会使查询运行得更慢),但您可以通过将 标志设置为来启用优化. 它主要用于测试。

    例如,使用标量子查询:

    从紧跟在第二 条语句之后的 执行可以看出,在启用优化的情况下,查询以类似于此处显示的形式重写:

    例如,使用查询: )

    检查并简化 执行此查询后的结果表明, 启用标志后,将以类似于此处显示的形式重写:

    示例,使用与上一个示例相同的表和数据的查询: )

    如果我们在启用 时 运行 查询 后执行 ,并简化结果的第二行,我们会看到它已被重写为类似这样的形式:

    有关详细信息,请参阅 第 8.2.2.4 节,“使用合并或实现优化派生表、视图引用和公用表表达式”,以及 第 8.2.1.19 节,“LIMIT 查询优化”第 8.2.2.1 节,“优化IN 和 EXISTS 子查询谓词与半连接转换”


上一篇: 光伏发电

平台注册入口