原理
- MySQL內(nèi)部采用了一種叫做 nested loop join的算法。Nested Loop Join 實(shí)際上就是通過驅(qū)動表的結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),然后一條一條的通過該結(jié)果集中的數(shù)據(jù)作為過濾條件到下一個表中查詢數(shù)據(jù),然后合并結(jié)果。如果還有第三個參與 Join,則再通過前兩個表的 Join 結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),再一次通過循環(huán)查詢條件到第三個表中查詢數(shù)據(jù)
優(yōu)化方案:
- 如果可以的話,盡可能的使用
join(inner join)替換left join - ON 后面的條件盡量加上索引
- 條件中盡量能夠過濾一些行將驅(qū)動表變得小一點(diǎn),用小表去驅(qū)動大表
-
select a.*, b.* from A left join B ON A.b_id = B.id where B.type = '1'與
select a.*, b.* from A join B ON A.b_id = B.id and B.type = '1'的效率好像相差無幾