Simple Nested loop join 就是双层循环,mysql中不会使用。

Index Nested-Loop Join(NLJ)【被驱动表有索引情况】

  • 首先有索引的表作为被驱动表,
  • 如果都有索引,小表作为驱动表

image.png

Block Nested-Loop Join(BNL)【被驱动表没有索引情况】

  • 就是Simple Nested loop join 加内存

Join - 图2
驱动表放入Join buffer中。

  • join_buffer_size(不如加索引,但是NLJ也能用到buffer

image.png

  • 原来内表扫3次,现在内表扫1次,相当于依据内表去扫内存中的外表数据(原来是磁盘)

image.png
如果join buffer放不下驱动表,分批放

Multi-Range Read优化【优化回表】

原因:无序回表产生随机io性能低下。
优化回表排序后批量回表。
用到read_rnd_buffer,做id排序。

  • read_rnd_buffer_size

image.png
image.png
image.png

Batched key access【对NLJ优化】【查被驱动表相当于回表,利用MRR思想】

开启:set optimizer_switch=’mrr=on,mrr_cost_based=off,batched_key_access=on’;

就是Index Nested-Loop Join原本不使用buffer的。现在可以使用join_buffer,做id排序。排序后批量被驱动表搜索。

  • join_buffer_size
  • BKA mysql默认不会启用?需要手动启动

image.png

Nested Hash Join(8.0)

image.png
image.png

  • 省去了bnl遍历内存,内存中是hashtable不是数组了。
  • hash只支持等值查询

MySQL 8.0发布,你熟悉又陌生的Hash Join? - 掘金