Simple Nested-Loop Join
我们来看一下当进行 join 操作时,mysql是如何工作的。常见的 join 方式有哪些?
如图,当我们进行连接操作时,左边的表是「驱动表」,右边的表是「被驱动表」
Simple Nested-Loop Join 这种连接操作是从驱动表中取出一条记录然后逐条匹配被驱动表的记录,如果条件匹配则将结果返回。然后接着取驱动表的下一条记录进行匹配,直到驱动表的数据全都匹配完毕
「因为每次从驱动表取数据比较耗时,所以MySQL并没有采用这种算法来进行连接操作」
Block Nested-Loop Join
既然每次从驱动表取数据比较耗时,那我们每次从驱动表取一批数据放到内存中,然后对这一批数据进行匹配操作。这批数据匹配完毕,再从驱动表中取一批数据放到内存中,直到驱动表的数据全都匹配完毕
批量取数据能减少很多IO操作,因此执行效率比较高,这种连接操作也被MySQL采用
对了,这块内存在MySQ中有一个专有的名词,叫做 join buffer,我们可以执行如下语句查看 join buffer 的大小
show variables like