2014-10-19 82 views
0

請幫助我優化有關爲電影獲取reccomended(rec)的查詢。我有很多記錄,查詢運行速度很慢。以下查詢運行2分鐘用SELECT IN SELECT以更高效的方式查詢mysql

SELECT rec.toMovieID, sum(rec.score) 
    FROM rec 
    WHERE movieID in 
     (SELECT movieid as movieID FROM userFavorites as ufv WHERE ufv.userid = 29) 
    GROUP BY rec.toAMovieID 
    ORDER BY rec.score DESC 
    LIMIT 10 

您認爲我可以優化它嗎?

回答

2

您可以使用內部聯接,而不是子查詢的

SELECT 
    rec.toMovieID, 
    sum(rec.score) 
FROM rec INNER JOIN userFavorites ON rec.movieID = userFavorites.movieid 
WHERE 
    userid = 29 
GROUP BY rec.toAMovieID 
ORDER BY rec.score DESC 
LIMIT 10 

您應該行設置索引where子句中,至少movieid和用戶ID。 (如果不是媒體鏈接完成)

+0

超級。爲我工作:)如果我有足夠的積分,我會放棄你。 – 2014-10-19 18:59:03

+0

如果'userFavorites'中有重複的記錄,那麼這將返回不正確的結果。 – 2014-10-19 18:59:06

1

您可以使用exists

SELECT rec.toMovieID, sum(rec.score) 
    FROM rec r 
    WHERE EXISTS (SELECT 1 FROM userFavorites as ufv WHERE ufv.userid = 29 and ufv.MovieId = r.MovieId) 
    GROUP BY rec.toAMovieID 
    ORDER BY rec.score DESC 
    LIMIT 10; 

你必須使用join因爲重複記錄要小心。

+0

我同意。但是通過在'userFavorites'中的'movieid'和'userid'上引入一個唯一的索引來查看可以防止的功能級別。 – Barry 2014-10-19 19:04:45