2014-02-15 82 views
3

假設這個表:posts_groupsMySQL的加入和性能

+---------+----------+--------+ 
| post_id | group_id | type |  
+---------+----------+--------+ 
| 1  | 1  | public | // group #1 sees post #1 where type is public 
+---------+----------+--------+ 

而且表:posts

+----+--------+ 
| id | type |  
+----+--------+ 
| 1 | public | // example : post #1 is public 
+----+--------+ 

查詢1

SELECT post_id FROM posts_groups pg 
JOIN posts p ON p.id = pg.post_id 
WHERE group_id = 1 AND pg.type = public 

那麼,這個檢查組1和typeFROM CURRENT表,然後選擇一些post_id。

QUERY2

SELECT post_id FROM posts_groups pg 
JOIN posts p ON p.id = pg.post_id 
WHERE group_id = 1 AND p.type = public 

這個查詢也做同樣的。但檢查typeFROM POSTS表

但哪種方法速度更快,性能更好。任何想法這兩個查詢如何工作。

條件過程!

查詢1,它說,如果(GROUP_ID = 1 AND紙張類型=公用)THEN如果(post.id = posts_groups.id)JOIN查詢2個職位

,它說,如果( group_id = 1)THEN if(post.id = posts_groups.id)THEN if(posts.type = public)JOIN帖子。

query2的過程稍長一點。或者我的邏輯錯了!

在此先感謝。

+0

使用'EXPLAIN',看看有什麼優化想做的事... –

回答

4

enter image description here

有兩種查詢沒什麼區別,只要繼續下去,並嘗試使用一個你喜歡的。

編輯:當你編輯你的問題。

它們在WHERE子句之前被連接,所以沒有區別。從第一張或第二張桌子開始,因爲他們先加入。

+0

我編輯了我的帖子,問題是別的先生echo_Me。謝謝。 – Pars

+0

我更新了帖子。請看看它。 :)謝謝 – Pars

+0

@Pars老兄,他們是在WHERE子句之前加入的,所以沒什麼區別。從第一張或第二張桌子開始,因爲他們先加入。 –

1

恕我直言,這可能有區別。

當然邏輯上WHERE處理之後加入,但大多數優化器將在加入之前/期間應用WHERE條件。如果類型列被編入索引,那麼計劃可能會發生變化,所以您應該將計劃作爲echo-Me已經寫過的內容進行比較。

如果這兩個類型的列應該是公共,您可以通過添加addtional條件幫助優化:

SELECT post_id FROM posts_groups pg 
JOIN posts p ON p.id = pg.post_id 
WHERE group_id = 1 AND pg.type = public 
AND p.type = public 

SELECT post_id FROM posts_groups pg 
JOIN posts p ON p.id = pg.post_id 
AND pg.type = p.type 
WHERE group_id = 1 AND pg.type = public