可以看到,驱动表是的type是ALL,所以是全表扫描,被驱动表有a索引,left join的时候,用到了a这个索引,因此这个语句执行流程是:
-
从表t1中读入一行数据
-
从数据行中,取出a字段到表t2里去查找
-
取出表t2中满足条件的行,跟t1的数据组成一行,作为结果集的一部分
-
重复上面操作,直到t1的数据取完为止
这个过程是先遍历表t1,然后根据表t1中取出的每行数据中的a值,去表t2中查询满足条件的记录。这里我们成为"Index Nested-Loop Join",简称NLJ。
通过上面所述,如果我们选择驱动表的话,就要选择小表来做驱动表。否则大表做驱动表是要查询所有的,效率会低很多。当然,前提是"可以使用被驱动表的索引"
这里我们把sql语句改一下:
explain select * from t1 left join t2 on t1.a=t2.b;
复制代码
t2表的b字段是无索引的