mysql - 如何在 MySQL 中使用嵌套循环连接而不是块嵌套循环连接?
问题描述
为了比较,我正在寻找一种方法来禁用块嵌套循环连接并使用简单的嵌套循环连接。根据 MySQL 的参考手册,它们都已实现: https ://dev.mysql.com/doc/refman/8.0/en/nested-loop-joins.html 但我未能找到如何将选项更改为这样做!
解决方案
您可以通过设置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;
推荐阅读
- javascript - 如何使我的暗模式在全屏打开时工作?
- swift - swift:将可选映射到数组的优雅方式
- javascript - 如何使地图覆盖javascript中的所有标记?
- pandas - 错误:未大小对象的 len() - Wilconox 符号秩检验
- extract - 提取类元素
- python - 如何让scrapy spider从起始网址下载图片?
- r - 在带有 na 的列上使用 cor.test()
- php - 如何解决 WordPress 插件中的命名空间冲突?
- ssh - 为什么通过 SSH 和 libssh 执行命令时 $PATH 不同?
- linux - 如何在 Jenkins 管道/Linux 中使用以下命令