저는 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
는'EXPLAIN''$ your_query'를 실행 해보십시오; http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/ – Cyclonecode
여기에서 추측 할 수 있습니다. 아마도 date_sub는 각 값을 계산하는 데 많은 시간이 걸릴 것입니다. 예를 들어 PHP에서 time()과 같은 유닉스 시대부터 초를 포함하는 새로운 필드를 추가하려고 시도한 다음 new_field> 120 * 3600을 120 시간 동안 변경합니다. – lfxgroove
테이블에 어떤 인덱스가 있습니까? EXPLAIN의 내용은 무엇입니까? –