2009-09-21 19 views
1

我想加入一個表中的數據的子集與另一個表中的數據(下面的例子),並從性能的角度來看,我想知道什麼是最好的方式來做到這一點,什麼是最可擴展的。加入何處數據,或放在where子句中?

表我想加入這個樣子的(其它表已經在查詢)。

 
vid    kid   uid 
1    34   12 
1    34   15 
2    22   18 
2    34   18 
2    22   15 

我的查詢是這樣的

 
SELECT * FROM similar 
RIGHT OUTER JOIN(SELECT event.stuff, eventdate.stuffshows 
FROM events 
JOIN evendate ON events.eid=eventdate.eid 
WHERE location= 'Paris' 
AND event.date 
BETWEEN '2009-08-14' 
AND '2009-08-17' 
GROUP BY event.date 
ORDER BY event.date 
LIMIT 0 , 5 
) mystuff ON event.bid = similar.id 
AND event.date=similar.date 

我想我可以把它變成

 
SELECT * FROM similar 
RIGHT OUTER JOIN(SELECT event.stuff, eventdate.stuffshows 
FROM events 
JOIN evendate ON events.eid=eventdate.eid 
WHERE 
user.vid=events.vid AND user.uid=15 AND user.kid=22 
location= 'Paris' 
AND event.date 
BETWEEN '2009-08-14' 
AND '2009-08-17' 
GROUP BY event.date 
ORDER BY event.date 
LIMIT 0 , 5 
) mystuff ON event.bid = similar.id 
AND event.date=similar.date 

我擔心的是,我有點混合使用其中一個連接。性能是否值得爲user.vid = events.vid設置第二個JOIN?或者做一個WHERE而不是一個連接更好?

對此有何建議?

+0

pedalpete:我有點被你最後一個WHERE子句拋出(event.date = similar.date)。我建議您將該語句移到OUTER JOIN條件或子查詢本身。就目前而言,event.date不應該對外部查詢可見。 – 2009-09-21 18:20:16

回答

3

如果你有興趣在性能上的差異,找出最簡單的方法就是你的前言與EXPLAIN SELECT語句。你會看到使用該索引和多少行需要被感動,等

0

如果你只是尋找拇指和性能的規則就相當於我用什麼使它成爲最符合邏輯的我的理解。我把定義join子句中兩個表之間聯接的字段以及where子句中的過濾條件。一般來說,如果你編寫了一個類似的查詢,並且連接條件保持不變,並且只有where子句發生了變化,那麼你就知道它是正確的。

0

只是爲了直接回答這個問題。從長遠來看,在「where」或「on」子句中加入限制並不重要。 mySQL會對它們進行優化,以便有效地運行相同的查詢(正如dnagirl解釋的那樣,您可以使用EXPLAIN查看)。像mysql工作臺這樣的工具可以顯示運行查詢所需的相對時間,這樣也可以幫助回答這些問題。對於這個特定的問題,因爲查詢基本上是相同的,所以你可以使用Jay的建議,然後去找一個讓你更易讀的東西。