私はテーブルビデオを持っており、そのためのトップビデオを作成する必要があります。私はビデオ行あたりのシンプルなカウンタを使用して、そのような各ユーザーのビューでそれを更新したスタートのためにMysql:期間中の行数をカウントする
:私たちは、3つの異なるトップを作成して、あたりの結果にいくつかの統一を追加することを決定した。その後
UPDATE videos SET video_id=video_id+1 WHERE video_id=?
トップスをより正確にするには、ip、: - 日 のトップ - 週 のトップ - 月のトップ
私は別々の行として、各ユーザーのビューをカウントする新しいテーブルを追加しました。
video_viewsテーブルが非常に大きくなるまで、すべてが問題なくなりました。ここで
は上のクエリです:
SELECT COUNT(vv.`view_id`) as counter,v.* FROM video v
LEFT JOIN video_views vv ON vv.`video_id`=v.`video_id`
WHERE vv.`date`>1320120130 /* It's the time = current time minus week or day */
GROUP BY v.`video_id`
ORDER BY counter DESC
LIMIT 50
問題は、この部分から始まり:
ORDER BY counter DESC
クエリを終えるのに約20秒かかります。注文なしでは通常16-32msです。ここで言うことをEXPLAINです:
id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,vv,range,date,video_id,date,5,NULL,149552,Using where; Using temporary; Using filesort
1,SIMPLE,v,eq_ref,PRIMARY,PRIMARY,4,movieslv_website.vv.video_id,1,
私はそれがあるため、「一時的な使用」のだ理解では、MySQLは結果をフィットし、その後、それらを並べ替えるために一時テーブルを作成しますか?
この場合、どのような解決策を適用できますか?
感謝:)