Simple Nested loop join 就是双层循环,mysql中不会使用。
Index Nested-Loop Join(NLJ)【被驱动表有索引情况】
- 首先有索引的表作为被驱动表,
- 如果都有索引,小表作为驱动表
Block Nested-Loop Join(BNL)【被驱动表没有索引情况】
- 就是Simple Nested loop join 加内存
将驱动表放入Join buffer中。
- join_buffer_size(不如加索引,但是NLJ也能用到buffer)
- 原来内表扫3次,现在内表扫1次,相当于依据内表去扫内存中的外表数据(原来是磁盘)
Multi-Range Read优化【优化回表】
原因:无序回表产生随机io性能低下。
优化回表,排序后批量回表。
用到read_rnd_buffer,做id排序。
- read_rnd_buffer_size
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默认不会启用?需要手动启动
Nested Hash Join(8.0)
- 省去了bnl遍历内存,内存中是hashtable不是数组了。
- hash只支持等值查询