JOIN算法:
Simple Nested-Loop Join
循環(huán)從驅(qū)動(dòng)表r中取出一行并與被驅(qū)動(dòng)表s進(jìn)行匹配,mysql沒(méi)有使用這種算法。

Index Nested-Loop Join
索引嵌套
select * from t1 join t2 on (t1.a=t2.a);
t2的a字段有索引
1.從表 t1 中讀入一行數(shù)據(jù) R;
2.從數(shù)據(jù)行 R 中,取出 a 字段到表 t2 里去查找;
3.取出表 t2 中滿足條件的行,跟 R 組成一行,作為結(jié)果集的一部分;
4.重復(fù)執(zhí)行步驟 1 到 3,直到表 t1 的末尾循環(huán)結(jié)束。
這里可以看出,驅(qū)動(dòng)表t1要做全表掃描,被驅(qū)動(dòng)表使用索引并且小表來(lái)做驅(qū)動(dòng)表。
Block Nested-Loop Join
如果被驅(qū)動(dòng)表上沒(méi)有索引的話,
1.把表 t1 的數(shù)據(jù)讀入線程內(nèi)存 join_buffer 中,由于我們這個(gè)語(yǔ)句中寫(xiě)的是 select *,因此是把整個(gè)表 t1 放入了內(nèi)存;
2.掃描表 t2,把表 t2 中的每一行取出來(lái),跟 join_buffer 中的數(shù)據(jù)做對(duì)比,滿足 join 條件的,作為結(jié)果集的一部分返回。

這個(gè)算法與Simple Nested-Loop Join的區(qū)別在于,他的比較過(guò)程實(shí)在內(nèi)存中完成的,而不需要每次比較都進(jìn)行一次磁盤(pán)IO操作。
如果join buffer不能放下所有的驅(qū)動(dòng)表,則分段放入join buffer,但其實(shí)最后比較次數(shù)是沒(méi)有變的。
這里也需要小表驅(qū)動(dòng)大表,因?yàn)榭梢詼p少分段次數(shù)