mysql查詢結(jié)果合并,mysql一張大表?
rows代表這個(gè)步驟相對(duì)上一步結(jié)果的每一行需要掃描的行數(shù),可以看到這個(gè)sql需要掃描的行數(shù)為35773*8134,非常大的一個(gè)數(shù)字。本來c和h表的記錄條數(shù)分別為40000+和10000+,這幾乎是兩個(gè)表做笛卡爾積的開銷了(select * from c,h)。
于是我上網(wǎng)查了下MySQL實(shí)現(xiàn)join的原理,原來MySQL內(nèi)部采用了一種叫做 nested loop join的算法。Nested Loop Join 實(shí)際上就是通過驅(qū)動(dòng)表的結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),然后一條一條的通過該結(jié)果集中的數(shù)據(jù)作為過濾條件到下一個(gè)表中查詢數(shù)據(jù),然后合并結(jié)果。如果還有第三個(gè)參與 Join,則再通過前兩個(gè)表的 Join 結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),再一次通過循環(huán)查詢條件到第三個(gè)表中查詢數(shù)據(jù),如此往復(fù),基本上MySQL采用的是最容易理解的算法來實(shí)現(xiàn)join。所以驅(qū)動(dòng)表的選擇非常重要,驅(qū)動(dòng)表的數(shù)據(jù)小可以顯著降低掃描的行數(shù)。