2013-04-22 183 views
1

我有以下,低性能,SQL查詢:提高SQL查詢性能與JOIN

SELECT * 
FROM news_events 
WHERE 1 AND (user_id = 2416) OR id IN(SELECT content_id FROM likes WHERE user_id = 2416) 
ORDER BY id DESC 
LIMIT 0,10 

news_events表上USER_ID索引。 喜歡表在user_id上有一個索引。

要儘量提高性能,我已經重新編寫使用INNER JOIN通過以下方式查詢:

SELECT a.* 
FROM news_events a 
INNER JOIN likes b ON (a.id = b.content_id) 
WHERE (a.user_id = 2416) OR (b.user_id = 2416) 
ORDER BY a.id DESC 
LIMIT 0,10 

但性能並不任何改善。我已經運行在這最後的查詢說明,這是結果:

mysql explain

我明白什麼我可以做些什麼來改善查詢性能的任何指針。

+0

你是什麼意思慢?多久了?你有多少行? – 2013-04-22 12:57:44

+1

與瑣事一起Q.表新聞事件中有多少列。 – 2013-04-22 12:59:30

+0

desc語句的限制+順序可能會導致性能下降。如果不是強制性的,請不要訂購,或者由ASC訂購。 – Sebas 2013-04-22 13:01:12

回答

3
SELECT * 
FROM 
(
    SELECT a.* 
    FROM news_events a 
    WHERE a.user_id = 2416 
    UNION 
    SELECT ne.* 
    FROM news_events ne 
     INNER JOIN likes l 
      ON ne.id=l.contentid 
    WHERE l.user_id = 2416 
) 
ORDER BY 1 DESC 
LIMIT 0,10 
+0

限制?排序desc?這不是同一個查詢 – Sebas 2013-04-22 13:03:52

+0

@Sebas更新了我的答案。 – 2013-04-22 13:09:56

+0

偉大的解決方案!這提高了查詢的性能。謝謝。 – fdezjose 2013-04-22 15:02:11

1

嘗試此查詢 -

SELECT * FROM news_events ne 
LEFT JOIN (SELECT content_id FROM likes WHERE user_id = 2416) l 
    ON ne.user_id = 2416 OR ne.id = l.content_id 
ORDER BY 
    ne.id DESC 
LIMIT 
    0, 10 

這些列應被索引:news_events.user_idnews_events.idlikes.user_idlikes.content_id

0

您的查詢已經足夠好了。由配偶發布的查詢也很好。但是,如果您擁有大量數據並且自那時以來沒有重建索引,則需要在兩個表上重建索引。

這是一個標準協議,db管理員需要及時重建所有索引,並重新編譯db中的所有對象+包。

我希望它會幫助:) 保持查詢!