为了进行比较,我正在寻找一种方法来禁用块嵌套循环联接,而使用简单的嵌套循环联接。 基于MySQL的参考手册,它们都被实现: https://dev.mysql.com/doc/refman/8.0/en/nested-loop-joins.html 但是我没有找到如何更改选项的方法!
答案 0 :(得分:0)
您可以通过设置optimizer_switch系统变量来微调优化器的行为:
optimizer_switch系统变量启用对优化器行为的控制。它的值是一组标志,每个标志的值都为on或off,以指示是启用还是禁用了相应的优化器行为。此变量具有全局值和会话值,可以在运行时更改。可以在服务器启动时设置全局默认值。
[...]
阻止嵌套循环标志
block_nested_loop(默认启用)
控制BNL连接算法的使用。
要完全禁用块嵌套联接并为其他所有功能使用默认值,可以使用
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;