JOIN算法:
Simple Nested-Loop Join
循環(huán)從驅(qū)動(dòng)表r中取出一行并與被驅(qū)動(dòng)表s進(jìn)行匹配载绿,mysql沒有使用這種算法。
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)表使用索引并且小表來做驅(qū)動(dòng)表姚炕。
Block Nested-Loop Join
如果被驅(qū)動(dòng)表上沒有索引的話摊欠,
1.把表 t1 的數(shù)據(jù)讀入線程內(nèi)存 join_buffer 中,由于我們這個(gè)語句中寫的是 select *柱宦,因此是把整個(gè)表 t1 放入了內(nèi)存些椒;
2.掃描表 t2,把表 t2 中的每一行取出來掸刊,跟 join_buffer 中的數(shù)據(jù)做對(duì)比免糕,滿足 join 條件的,作為結(jié)果集的一部分返回忧侧。
這個(gè)算法與Simple Nested-Loop Join的區(qū)別在于石窑,他的比較過程實(shí)在內(nèi)存中完成的,而不需要每次比較都進(jìn)行一次磁盤IO操作蚓炬。
如果join buffer不能放下所有的驅(qū)動(dòng)表松逊,則分段放入join buffer,但其實(shí)最后比較次數(shù)是沒有變的肯夏。
這里也需要小表驅(qū)動(dòng)大表经宏,因?yàn)榭梢詼p少分段次數(shù)