一.NLJ算法(嵌套循環(huán)連接算法)
假如A表數(shù)據(jù)存在10000條數(shù)據(jù)蜘欲,且A表數(shù)據(jù)中字段a是加了索引的猾担;B表數(shù)據(jù)存在100條數(shù)據(jù)袭灯;
執(zhí)行select * from A inner join B on A.a=B.a
執(zhí)行過程:
1.先把B表從磁盤上讀取一條;讀取A表的二級索引字段A,讀取到A表的id绑嘹,回表讀取聚簇索引稽荧,找到對應(yīng)的記錄,讀取磁盤一次工腋;執(zhí)行完成讀取磁盤200次姨丈。
二.BNL算法(基于塊的嵌套循環(huán)連接算法)
假如A表數(shù)據(jù)存在10000條數(shù)據(jù),且A表數(shù)據(jù)中字段a是沒有加索引的擅腰;B表數(shù)據(jù)存在100條數(shù)據(jù)蟋恬;
執(zhí)行select * from A inner join B on A.a=B.a
執(zhí)行過程:
1.先把B全表掃描,加載到j(luò)oin_buffer內(nèi)存中趁冈,相當(dāng)于磁盤讀取100次
2.因?yàn)锳表不存在索引歼争,只能全表掃描聚簇索引拜马,然后讀取到一條記錄會(huì)與join_buffer中的數(shù)據(jù)的字段a做比較(所以A表磁盤讀取10000次,
整體執(zhí)行過程內(nèi)存計(jì)算1000000次沐绒、磁盤讀取10100次)
如果不使用算法執(zhí)行過程:
1.先把B全表掃描一行俩莽,然后使用聚簇索引全表掃描A表,執(zhí)行完成讀取磁盤1000000次洒沦。
表連接優(yōu)化:
1.在關(guān)聯(lián)字段上加上索引。
2.盡量小表作為驅(qū)動(dòng)表价淌,大表作為被驅(qū)動(dòng)表申眼。