2012-02-12 2 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입니다.

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은 결과를 맞게, 그 후 그것들을 정렬하는 임시 테이블을 생성합니다 : 여기에 이야기를 EXPLAIN 무엇인가?

이 상황에서 어떤 솔루션을 적용 할 수 있습니까?

감사합니다 :)

답변

0

왼쪽을 교체 시도는 또한 모든 필드 V를 선택하지 않으려 조인 내부로 가입 할 수 있습니다. * 단지 필요한 것들. 또한 this을 살펴보십시오.

메모리 임시 테이블의 최대 크기

는 tmp_table_size 변수의 최소 및 max_heap_table_size는 아마 인 - 메모리 임시 테이블이 너무 속도를 증가 증가

값.

관련 문제