首页 > 解决方案 > 如何在 MySQL 中使用嵌套循环连接而不是块嵌套循环连接?

问题描述

为了比较,我正在寻找一种方法来禁用块嵌套循环连接并使用简单的嵌套循环连接。根据 MySQL 的参考手册,它们都已实现: https ://dev.mysql.com/doc/refman/8.0/en/nested-loop-joins.html 但我未能找到如何将选项更改为这样做!

标签: mysqljoin

解决方案


您可以通过设置optimizer_switch系统变量来微调优化器的行为:

optimizer_switch 系统变量可以控制优化器的行为。它的值是一组标志,每个标志都有一个值 on 或 off 来指示相应的优化器行为是启用还是禁用。此变量具有全局值和会话值,可以在运行时更改。全局默认值可以在服务器启动时设置。

[...]

  • 阻止嵌套循环标志

    block_nested_loop(默认开启)

    控制 BNL 连接算法的使用。

要完全禁用块嵌套连接并为其他所有内容使用默认值,您可以使用

SET optimizer_switch='block_nested_loop=off';

另一种方法是使用优化器提示

控制优化器的另一种方法是使用优化器提示,它可以在单个语句中指定。因为优化器提示适用于每个语句,所以它们对语句执行计划的控制比使用 optimizer_switch 可以实现的更精细。例如,您可以在语句中启用对一个表的优化,并禁用对不同表的优化。语句中的提示优先于 optimizer_switch 标志。

[...]

BNL, NO_BNL:启用或禁用指定表的 BNL。

你可以使用例如

SELECT /*+ NO_BNL() */ t1.* FROM t1 INNER JOIN t2 INNER JOIN t3;

推荐阅读