簡體   English   中英

是否有可能使這個推薦SQL查詢更快?

[英]Is it possible to make this recommender SQL query faster?

我有2個表,其中一個存儲項目,另一個存儲喜歡。

存儲喜歡的表稱為video_liked,有2列,video_id和user_id,有2個索引 - video_id-user_id(UNIQUE)和user_id-video_id(PRIMARY)。

另一個表稱為視頻,具有主索引和自動增量列ID。

我正在嘗試獲取喜歡觀眾正在觀看的用戶喜歡的項目列表,按照喜歡它們的人數排序,最少2個喜歡。

我正在使用的查詢是

SELECT vid . * , count( video_liked1.user_id ) AS PersonCount
FROM video AS vid, video_liked, video_liked AS video_liked1
WHERE video_liked.user_id = video_liked1.user_id
AND video_liked.video_id <> video_liked1.video_id
AND video_liked1.video_id = 'ITEM_ID'
AND vid.id = video_liked.video_id
GROUP BY video_liked.video_id
HAVING count( video_liked1.user_id ) >2
ORDER BY PersonCount DESC
LIMIT 12

當有很多喜歡時,查詢很慢,所以我把它縮減到最基本的結構

SELECT vid. *
FROM video AS vid, video_liked, video_liked AS video_liked1
WHERE video_liked.user_id = video_liked1.user_id
AND video_liked.video_id <> video_liked1.video_id
AND video_liked1.video_id = 'ITEM_ID'
AND vid.id = video_liked.video_id
GROUP BY video_liked.video_id
LIMIT 12

它有點快,但仍然需要0.05秒才能在28k行的同類表上執行

EXPLAIN為我提供的輸出太寬而不適合這里,沒有wordwrapping,所以這里有一個指向pastebin的鏈接

http://pastebin.com/raw.php?i=6edwdniQ

這是我的表也在pastebin中

http://pastebin.com/raw.php?i=jwK1QucA

編輯:

按照建議更改了查詢

SELECT vid . *, count( v1.user_id ) AS PersonCount
FROM video AS vid
JOIN video_liked AS v1 ON vid.id = v1.video_id
JOIN video_liked AS v2 ON v2.video_id = 'ITEM_ID'
AND v1.user_id = v2.user_id
AND v1.video_id <> v2.video_id
GROUP BY v1.video_id
ORDER BY PersonCount DESC
LIMIT 12 

緩慢的罪魁禍首似乎是使用GROUP BY,它創建臨時表。

從查詢中刪除CROSS JOIN 那些膨脹你的數據集。

SELECT vid. *
FROM video AS vid
JOIN video_liked  AS v1 ON vid.video_id = v1.video_id
JOIN video_liked AS v2 ON v2.video_id = 'ITEM_ID' AND v1.user_id=v2.user_id AND v1.video_id <> v2.video_id
GROUP BY video_liked.video_id
LIMIT 12

除了刪除交叉連接之外,我還會在SELECT子句中明確定義所需的列,即使您需要所有列。

這個DB在什么平台上? 您在視頻表上還有哪些其他索引?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM