2011-03-17 42 views
23

可能重複:
MySQL: Inner join vs Where
Explicit vs implicit SQL joinsMySQL性能優化:加入ON VS WHERE

有什麼不同的表現明智的,當我們需要運行 「JOIN ON」 和「WHERE連接查詢「條款? (無論表格的數量或表格中的條目數量)

不確定是否已經討論過該主題。即使如此,我也想知道是否使用最新版本的MySQL(5.1及以上版本),事情已經發生了變化。

一個解釋性聲明清楚地表明考慮行數的差異很大。

我使用的語法是:

使用JOIN ON

SELECT <field names> 
FROM <table1> 
JOIN <table2> ON <join_condition> 
AND JOIN <table3> ON <join_condition> 
AND JOIN <table4> ON <join_condition> 
.... 

使用WHERE

SELECT <field names> 
FROM <table names list separated by comma> 
WHERE <join_condition> 
AND <join_condition> 
AND <join_condition> 
.... 

所以不能確定是否使用JOIN的ON或WHERE子句中會有所作爲。請協助。

+1

重複http://stackoverflow.com/questions/5273942/mysql-inner-join-vs-where和http://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins – 2011-03-17 12:22:53

+1

嗯......它可能不是重複的,因爲Vasanthakumar建議解釋計劃是不同的。你能提供這些計劃嗎? – 2011-03-17 12:32:35

+0

不知道關於MySQL,但在Oracle中這些是完全等價的。 – 2011-03-17 12:36:26

回答

2

我懷疑使用「JOIN」正在做「左連接」。嘗試使用「INNER JOIN」並查看explain語句是否相同。

SELECT <field names> 
FROM <table1> 
INNER JOIN <table2> ON <join_condition> 
INNER JOIN <table3> ON <join_condition> 
INNER JOIN <table4> ON <join_condition> 
... 

當使用內部聯接時,我不會指望你的兩個查詢之間存在性能差異。我會擔心更多有關正確的索引。確保連接條件可以使用索引列進行匹配。

+0

這將是相當令人驚訝的。 'LEFT JOIN'是'LEFT OUTER JOIN'的同義詞。查看文檔:http://dev.mysql.com/doc/refman/5.1/en/join.html – 2011-03-17 12:50:40

+0

你是對的。忽略我最初的陳述。 – 2011-03-17 15:02:48

+3

'JOIN ... ON'是'INNER JOIN'的同義詞,沒有'ON'的'JOIN'是'CROSS JOIN'的同義詞。文檔:http://dev.mysql.com/doc/refman/5.0/en/join.html – 2015-01-21 18:38:26

2

下面是這兩種方法的一個很好的分析:SQL left join vs multiple tables on FROM line?

這種解釋是通用的,我也不太清楚是什麼的MySQL在做這件事情;但無論哪種方式,JOIN總是更加明確和清晰,並且可以從一個引擎移動到另一個引擎,而不會對查詢邏輯進行重大更改。