2012-02-12 5 views
0

У меня есть видео в таблице, и мне нужно создать для него лучшие видео.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 создает временную таблицу, чтобы соответствовать результатам и сортировать их в дальнейшем?

Какие решения могут быть применены для помощи в этой ситуации?

Спасибо :)

ответ

0

Попробуйте заменить левую присоединиться внутреннее соединение, а также стараться не выбрать все поля v. *, Только необходимые из них. Также взгляните на this.

Максимальный размер в памяти временных таблиц является минимальным из tmp_table_size и max_heap_table_size значения

Может быть, увеличивая в памяти временные таблицы увеличит скорость тоже.

Смежные вопросы