mysql表连接算法
2022-09-14 本文已影响0人
Rena的秘密
一.NLJ算法(嵌套循环连接算法)
假如A表数据存在10000条数据,且A表数据中字段a是加了索引的;B表数据存在100条数据;
执行select * from A inner join B on A.a=B.a
执行过程:
1.先把B表从磁盘上读取一条;读取A表的二级索引字段A,读取到A表的id,回表读取聚簇索引,找到对应的记录,读取磁盘一次;执行完成读取磁盘200次。
二.BNL算法(基于块的嵌套循环连接算法)
假如A表数据存在10000条数据,且A表数据中字段a是没有加索引的;B表数据存在100条数据;
执行select * from A inner join B on A.a=B.a
执行过程:
1.先把B全表扫描,加载到join_buffer内存中,相当于磁盘读取100次
2.因为A表不存在索引,只能全表扫描聚簇索引,然后读取到一条记录会与join_buffer中的数据的字段a做比较(所以A表磁盘读取10000次,
整体执行过程内存计算1000000次、磁盘读取10100次)
如果不使用算法执行过程:
1.先把B全表扫描一行,然后使用聚簇索引全表扫描A表,执行完成读取磁盘1000000次。
表连接优化:
1.在关联字段上加上索引。
2.尽量小表作为驱动表,大表作为被驱动表。