2011-10-07 146 views
2

您好我想知道哪種查詢適合多個表。Mysql查詢性能。哪一個最好?

對於如:

select table1.id, table1.name from table1,table2,table3 
where table1.id=table2.id and table2.id=table3.id 

select table1.id, table1.name 
from table1 
inner join table2 on table1.id=table2.id 
inner join table3 on table2.id=table3.id 
where 1 

select table1.id, table1.name 
from table1 
join table2 on table1.id=table2.id 
join table3 on table2.id=table3.id 
where 1 

哪種查詢的是最好的表現嗎?

+1

'從表1,table2'是被稱爲'哎呀意外的交叉join'反模式。 – Johan

回答

5

它們應該完全一樣。可能您可能想要閱讀MySQL手冊中的corresponding section(但這只是關於語法,而不是關於性能)。

+0

+1。瞬間! .... :) –

4

我希望所有這3個被解析爲完全等效,因此將具有相同的性能。後兩個查詢中的where子句是多餘的。

許多開發人員更喜歡在第一個查詢中使用隱​​式語法的顯式ANSI-92語法(在後面的2個查詢中使用) - 但是,這應該不會影響性能。

0

join僅僅是inner join一個快捷方式,並做from table1,table2 where是一樣的內部連接太(see mysql documentationmysql forum)。他們都應該以同樣的方式被mysql對待(第二個解析時間可能會稍低一點,但這可以忽略不計)。

至少你應該選擇一個更加可輻射(並且可以維護的方式),這將是第二個(在我看來,有些人可能會喜歡第一個)。

+1

如果將逗號和'JOIN'混合使用,那麼它就不一樣了:逗號運算符的優先級小於INNER JOIN,CROSS JOIN,LEFT JOIN等(來自http:// dev.mysql.com/doc/refman/5.0/en/join.html) – michael667

+1

-1,從table1開始,table2是一個**交叉連接**,您可以限制result子句中where子句不會改變該事實。 MySQL還允許使用內部連接語法進行交叉連接,但這只是針對SQL標準的MySQL工作,其他DBMS不允許打破內部連接。 – Johan

1

正如已經指出的那樣,所有形式在效率上都是一樣的。但是,它們的不同之處在於非常重要的方面:可讀性。

這就是爲什麼我更喜歡使用inner join語法。這也是標準中流行的符號。

您可能會發現這個問題的答案非常有用:SQL Inner Join syntax