2012-02-12 68 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) 

一切正常,直到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的创建临时表,以适应的结果和他们算账排序?

在这种情况下可以采用哪些解决方案?

谢谢:)

回答

0

尝试更换左侧有一个内加盟加盟,也尽量不要选择所有字段诉*,只是需要的人。也看看this

在内存中的临时表的最大尺寸是tmp_table_size的最小和值max_heap_table_size

也许增加在内存中的临时表将增加速度过。