我有一个桌面视频,我需要为它创建热门视频。
首先,我在每个视频行使用简单的计数器,并在每个用户视图上更新它:
UPDATE videos SET video_id=video_id+1 WHERE video_id=?
之后我们决定创建三个不同的tops并为每个ip的结果添加一些统一,以使top更准确: - 最重要的一天 - 本周最佳人选 - 月末
我添加了新表,将每个用户视图计为一个单独的行。
INSERT INTO video_views(video_id,date,ip) VALUES(video_id,current date,user ip)
在video_views表变得非常大之前,一切都很顺利。
这是查询top:
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创建临时表以适应结果并在之后对它们进行排序?
在这种情况下,可采用哪些解决方案来提供帮助?
谢谢:)
答案 0 :(得分:0)
尝试用内连接替换左连接,并尝试不选择所有字段v。*,只选择所需的字段。另请查看this。
内存临时表的最大大小是tmp_table_size和max_heap_table_size值的最小值
也许增加内存临时表也会提高速度。