2010-03-28 5 views
1

두 개의 news, news_view 테이블이 있습니다. 기사를 볼 때마다 뉴스 ID, IP 주소 및 날짜가 news_views에 기록됩니다.이 MySQL 하위 쿼리를 최적화 할 수 있습니까?

나는 하위 쿼리가있는 쿼리를 사용하여 뉴스에서 가장 많이 본 제목을 가져 오는데, 각각에 대해 최근 24 시간 동안보기의 총 개수를 가져옵니다.

news_views에 수십만 개의 행이 있고 완료되기 전에 전체 테이블을 거쳐야하기 때문에 실행하는 데 5-10 초가 걸리는 것을 제외하고는 정상적으로 작동합니다. 쿼리는 다음과 같이 개선 될 수있는 방법이 있습니까?

SELECT n.title 
,  nv.views 
FROM news n 
LEFT 
JOIN (
     SELECT news_id 
     ,  count(DISTINCT ip) AS views 
     FROM news_views 
     WHERE datetime >= SUBDATE(now(), INTERVAL 24 HOUR) 
     GROUP 
     BY  news_id 
     ) AS nv 
ON  nv.news_id = n.id 
ORDER 
BY  views DESC 
LIMIT 15 
+2

테이블에 어떤 색인이 있습니까? –

+0

없음, 어떤 제안? – Dan

답변

2
당신이 파생 테이블로 뷰의 수를 계산할 필요가 있다고 생각하지 않습니다

(또는 무엇이든 mysql을의 동등한은)

SELECT n.id, n.title, count(DISTINCT nv.ip) AS views 
FROM news n 
LEFT JOIN news_views nv 
ON nv.news_id = n.id 
WHERE nv.datetime >= SUBDATE(now(), INTERVAL 24 HOUR) 
GROUP BY n.id, n.title 
ORDER BY views DESC LIMIT 15 

여기에 최고의 조언은 EXPLAIN을 통해 이러한 쿼리를 실행하는 것입니다 인덱스 스캔, 테이블 스캔, 예상 비용 등 실제로 수행 할 작업을 확인하십시오. 전체 테이블 스캔은 피하십시오.

+0

쿼리가 실행 시간이 0.5 초 미만으로 떨어졌습니다. 감사합니다! – Dan

관련 문제