[英]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.