2011-11-25 3 views
0

저는 mysql을 초보자입니다. 테이블 뷰에서 가장 많이 본 contentid (지난 120 시간 동안)를 가져와야합니다. 보기 테이블에는 200,000 (lakh) 개의 레코드가 들어 있습니다. contentid 열에 대한 색인을 생성했지만 결과를 가져 오는 데 최대 10 초가 걸립니다. 다음과 같이같은 쿼리에서 그룹을 사용하여 순서를 지정할 때 mysql 쿼리가 느려집니다.

조회 테이블 구조는 다음과 같습니다

contentid viewed    ip 
155  2011-10-26 00:07:52  216.251.77.226 
1150 2011-10-26 00:08:15  65.52.109.72 
1134 2011-10-26 00:08:30  178.53.54.221 
14  2011-10-26 00:08:49  178.53.54.221 
693  2011-10-26 00:08:58  115.184.174.136 
433  2011-10-26 00:09:14  66.249.71.138 
558  2011-10-26 00:09:26  91.83.214.3 
715  2011-10-26 00:16:01  128.171.36.161 
226  2011-10-26 00:16:06  110.36.39.102 
562  2011-10-26 00:16:51  84.3.173.188 
1134 2011-10-26 00:16:53  110.39.67.139 
198  2011-10-26 00:16:57  220.227.133.163 
155  2011-10-27 05:43:59  64.135.215.142 
155  2011-10-27 08:39:46  157.55.39.86 
155  2011-10-27 11:23:05  99.55.166.146 
155  2011-10-27 15:40:29  174.255.241.202 
1150 2011-10-26 00:50:50  119.30.96.83 
1150 2011-10-26 01:02:58  66.249.71.138 
1150 2011-10-26 08:02:31  95.144.197.55 
1132 2011-10-26 00:16:07  119.160.126.99 

을 내 쿼리 내가 이해가

SELECT contentid FROM views 
where viewed > DATE_SUB(NOW(), INTERVAL 120 HOUR) 
GROUP BY contentid ORDER BY count(contentid) desc limit 0, 15 
+5

는'EXPLAIN''$ your_query'를 실행 해보십시오; http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/ – Cyclonecode

+0

여기에서 추측 할 수 있습니다. 아마도 date_sub는 각 값을 계산하는 데 많은 시간이 걸릴 것입니다. 예를 들어 PHP에서 time()과 같은 유닉스 시대부터 초를 포함하는 새로운 필드를 추가하려고 시도한 다음 new_field> 120 * 3600을 120 시간 동안 변경합니다. – lfxgroove

+1

테이블에 어떤 인덱스가 있습니까? EXPLAIN의 내용은 무엇입니까? –

답변

2

이 쿼리의 멋진 인덱스는 viewed의 간단한 인덱스 또는 (contentid, viewed)의 복합 인덱스 중 하나라고 생각합니다.


또한 변경해야 COUNT(contentid)COUNT(*)에 :

SELECT contentid FROM views 
WHERE viewed > DATE_SUB(NOW(), INTERVAL 120 HOUR) 
GROUP BY contentid 
ORDER BY COUNT(*) DESC 
LIMIT 0, 15 
+0

ypercube 고맙습니다. 표시된 열의 색인을 생성하면 쿼리 실행 속도가 빨라집니다. – nithi

-1

이며,이 Now() 기능이 모든 행에 대해 호출됩니다, 잘못 될 수도 있습니다, 왜이 함수를 한 번 호출하고 결과를 저장하고 결과를 쿼리에 사용하는 것이 좋습니다.

viewed 컬럼에 인덱스를 추가하면, mysql이 테이블로 갈 필요가 없을 수도 있습니다. 이 쿼리를 실행하는 데 필요한 모든 데이터는 인덱스 파일에서 사용할 수 있습니다.

+0

솔루션에 감사드립니다. 나는 네가 한 말을 시도했다. 그러나 큰 차이는 없습니다. – nithi

+0

@nithi 한 번 더 제안을 참조하십시오. – Zohaib

관련 문제