8.9.2 可切换优化
从 MySQL 8.0.21 开始,优化器在许多情况下能够将 、 、 或 子句中的标量子查询转换 为派生 表 上的左外连接。(根据派生表的可空性,这有时可以进一步简化为内部联接。)这可以用于满足以下条件的子查询:
在 MySQL 8.0.22 之前,子查询不能包含 子句。
此优化还可以应用于表子查询,该子查询是、、 或 的参数, 不包含 .
此标志的默认值为 ,因为在大多数情况下,启用此优化不会产生任何明显的性能改进(在许多情况下甚至会使查询运行得更慢),但您可以通过将 标志设置为来启用优化. 它主要用于测试。
例如,使用标量子查询:
从紧跟在第二 条语句之后的 执行可以看出,在启用优化的情况下,查询以类似于此处显示的形式重写:
例如,使用查询: )
检查并简化 执行此查询后的结果表明, 启用标志后,将以类似于此处显示的形式重写:
示例,使用与上一个示例相同的表和数据的查询: )
如果我们在启用 时 运行 查询 后执行 ,并简化结果的第二行,我们会看到它已被重写为类似这样的形式:
有关详细信息,请参阅 第 8.2.2.4 节,“使用合并或实现优化派生表、视图引用和公用表表达式”,以及 第 8.2.1.19 节,“LIMIT 查询优化”和 第 8.2.2.1 节,“优化IN 和 EXISTS 子查询谓词与半连接转换”。