2012-02-12 94 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

也許增加在內存中的臨時表將增加速度過。