【发布时间】:2019-10-17 15:11:59
【问题描述】:
为了比较,我正在寻找一种方法来禁用块嵌套循环连接并使用简单的嵌套循环连接。 基于 MySQL 的参考手册,它们都实现了: https://dev.mysql.com/doc/refman/8.0/en/nested-loop-joins.html 但我没有找到如何更改选项!
【问题讨论】:
为了比较,我正在寻找一种方法来禁用块嵌套循环连接并使用简单的嵌套循环连接。 基于 MySQL 的参考手册,它们都实现了: https://dev.mysql.com/doc/refman/8.0/en/nested-loop-joins.html 但我没有找到如何更改选项!
【问题讨论】:
您可以通过设置optimizer_switch 系统变量来微调优化器的行为:
optimizer_switch 系统变量可以控制优化器的行为。它的值是一组标志,每个标志都有一个值 on 或 off 来指示相应的优化器行为是启用还是禁用。此变量具有全局值和会话值,可以在运行时更改。全局默认值可以在服务器启动时设置。
[...]
阻止嵌套循环标志
block_nested_loop(默认开启)
控制 BNL 连接算法的使用。
要完全禁用 block nested join 并为其他所有内容使用默认值,您可以使用
SET optimizer_switch='block_nested_loop=off';
另一种方法是使用Optimizer hints,
控制优化器的另一种方法是使用优化器提示,它可以在单个语句中指定。因为优化器提示适用于每个语句,所以它们对语句执行计划的控制比使用 optimizer_switch 可以实现的更精细。例如,您可以在语句中启用对一个表的优化,并禁用对不同表的优化。语句中的提示优先于 optimizer_switch 标志。
[...]
BNL, NO_BNL:为指定的表启用或禁用 BNL。
你可以使用例如
SELECT /*+ NO_BNL() */ t1.* FROM t1 INNER JOIN t2 INNER JOIN t3;
【讨论】: