mysql inner join用法 mysql的inner join連接查詢(xún)?cè)趺词褂茫?/h1>
mysql的inner join連接查詢(xún)?cè)趺词褂??MySQL 子句將一個(gè)表中的行與其他表中的行進(jìn)行匹配,并允許從兩個(gè)表中查詢(xún)包含列的行記錄。子句是語(yǔ)句的可選部分,它出現(xiàn)在FROM子句之后。在使用子句之
mysql的inner join連接查詢(xún)?cè)趺词褂茫?/h2>
MySQL 子句將一個(gè)表中的行與其他表中的行進(jìn)行匹配,并允許從兩個(gè)表中查詢(xún)包含列的行記錄。
子句是語(yǔ)句的可選部分,它出現(xiàn)在FROM子句之后。
在使用子句之前,必須指定以下條件:
- 首先,在FROM子句中指定主表。
- 其次,表中要連接的主表應(yīng)該出現(xiàn)在子句中。理論上說(shuō),可以連接多個(gè)其他表。 但是,為了獲得更好的性能,應(yīng)該限制要連接的表的數(shù)量(最好不要超過(guò)三個(gè)表)。
- 第三,連接條件或連接謂詞。連接條件出現(xiàn)在子句的關(guān)鍵字之后。連接條件是將主表中的行與其他表中的行進(jìn)行匹配的規(guī)則。
子句的語(yǔ)法如下:
假設(shè)使用子句連接兩個(gè)表:和,我們來(lái)簡(jiǎn)化上面的語(yǔ)法。
mysql一張大表,一張小表,如何join最快?
rows代表這個(gè)步驟相對(duì)上一步結(jié)果的每一行需要掃描的行數(shù),可以看到這個(gè)sql需要掃描的行數(shù)為35773*8134,非常大的一個(gè)數(shù)字。本來(lái)c和h表的記錄條數(shù)分別為40000 和10000 ,這幾乎是兩個(gè)表做笛卡爾積的開(kāi)銷(xiāo)了(select * from c,h)。
于是我上網(wǎng)查了下MySQL實(shí)現(xiàn)join的原理,原來(lái)MySQL內(nèi)部采用了一種叫做 nested loop join的算法。Nested Loop Join 實(shí)際上就是通過(guò)驅(qū)動(dòng)表的結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),然后一條一條的通過(guò)該結(jié)果集中的數(shù)據(jù)作為過(guò)濾條件到下一個(gè)表中查詢(xún)數(shù)據(jù),然后合并結(jié)果。如果還有第三個(gè)參與 Join,則再通過(guò)前兩個(gè)表的 Join 結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),再一次通過(guò)循環(huán)查詢(xún)條件到第三個(gè)表中查詢(xún)數(shù)據(jù),如此往復(fù),基本上MySQL采用的是最容易理解的算法來(lái)實(shí)現(xiàn)join。所以驅(qū)動(dòng)表的選擇非常重要,驅(qū)動(dòng)表的數(shù)據(jù)小可以顯著降低掃描的行數(shù)。