У меня есть видео в таблице, и мне нужно создать для него лучшие видео.Mysql: подсчет строк за период времени
Для начала я использовал простой счетчик за видеорядом и обновлять его на каждом окне пользователя, как, что:
UPDATE videos SET video_id=video_id+1 WHERE video_id=?
После этого мы решили создать три вершины и добавить унификацию результатов в IP, чтобы сделать вершины более точными: - верх дня - верх недели - верх месяца
Я добавил новую таблицу для подсчета каждого вида пользователя в виде отдельной строки.
INSERT INTO video_views(video_id,date,ip) VALUES(video_id,current date,user ip)
Все прошло нормально, пока таблица видеоизображений не стала очень большой.
Вот запрос на вершине:
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-32 мс. Вот что 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 создает временную таблицу, чтобы соответствовать результатам и сортировать их в дальнейшем?
Какие решения могут быть применены для помощи в этой ситуации?
Спасибо :)