Mysql:计算一段时间的行

时间:2012-02-12 17:36:49

标签: mysql

我有一个桌面视频,我需要为它创建热门视频。

首先,我在每个视频行使用简单的计数器,并在每个用户视图上更新它:

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创建临时表以适应结果并在之后对它们进行排序?

在这种情况下,可采用哪些解决方案来提供帮助?

谢谢:)

1 个答案:

答案 0 :(得分:0)

尝试用内连接替换左连接,并尝试不选择所有字段v。*,只选择所需的字段。另请查看this

  

内存临时表的最大大小是tmp_table_size和max_heap_table_size值的最小值

也许增加内存临时表也会提高速度。