3

私は2つのテーブルを持っています。1つはアイテムを格納し、もう1つはいいねを格納します。

Likesを格納するテーブルはvideo_likedと呼ばれ、video_idとuser_idの2つの列があり、video_id-user_id(UNIQUE)とuser_id-video_id(PRIMARY)の2つのインデックスがあります。

もう1つのテーブルはビデオと呼ばれ、プライマリインデックスと自動インクリメント列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

少し高速ですが、28k行のlikesテーブルで実行するには0.05秒かかります

EXPLAINは、幅が広すぎてワードラッピングなしではここに収まらない出力を提供するので、代わりにpastebinへのリンクがあります

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

これが私のテーブルもペーストビンにあります

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 

速度低下の原因は、一時テーブルを作成するGROUPBYを使用しているようです。

4

2 に答える 2

1

クエリからsを削除し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
于 2012-06-08T03:27:39.777 に答える
1

クロス結合を削除することに加えて、すべての列が必要な場合でも、SELECT句で必要な列を明示的に定義します。

このDBはどのプラットフォームにありますか?ビデオテーブルには他にどのようなインデックスがありますか?

于 2012-06-08T03:37:31.477 に答える