2012-08-01 3 views
0

나는 100M 레코드를 포함하는 데이터베이스 테이블이 있습니다. 20 분 동안 실행하는 쿼리가 있습니다. 어떻게 간단하고 빠르게 만들 수 있습니까?MySQL 데이터베이스 거대한 레코드

SELECT newnum, 
     Sum(Ceil(seconds/60)) AS ttime 
FROM astb 
GROUP BY newnum 
ORDER BY ttime DESC 
LIMIT 100; 
+0

테이블에 인덱스가 있습니까? – Bridge

+0

해당 쿼리에 GROUP BY가 누락 되었습니까? – Barmar

+0

@Barmar 내 검색어가 업데이트되었습니다. –

답변

0

ORDER BY 및 인덱스 최고의 LIMIT 작동합니다. 따라서 가능한 경우 열 newnum에 대한 색인을 가질 수 있습니다.

또 다른 요점은 거대한 테이블의 모든 레코드를 계산하는 것입니다. 이러한 레코드에 대한 계산보다 먼저 임시 테이블에서 레코드를 선택하는 것이 좋습니다.

EDIT 업데이트] SCRIPT : 그것은 큰 데이터베이스 디자인이 아니다

CREATE TEMPORARY TABLE temp AS 
(SELECT newnum, SUM(seconds) AS ttime 
FROM astb GROUP BY newnum) 

SELECT newnum, CEIL(ttime/60) AS ttime 
FROM temp 
ORDER BY ttime DESC 
LIMIT 100; 

DROP TABLE temp; 
+0

ttime은 열이 아니므로 합계의 결과입니다. – Barmar

+0

나는이 테이블에 여전히 너무 많은 시간을 들여 색인을 붙였다. 임시 테이블로 어떻게 할 수 있습니까? –

+0

열 이름을 편집했습니다. 이미 색인이 있다면 임시 테이블을 사용하고 계산하는 것만 큼 가치가 있습니다. 이 경우에는 계산 필드로 주문하고 제한하려는 경우 매우 복잡합니다. 난 당신이 임시 테이블에 합계를 삽입하고 다음 초 및 임시 테이블에서 주문을 변환하려고 할 수있을 것 같아요? 그것은 의미가 있습니까? – huzeyfe

0

,하지만 당신은 그것을 모두 재 계산하지 않아도 당신은 ceil(seconds/60)을 유지하기 위해 열을 추가 할 수 있습니다 : 당신은이 같은 임시 테이블을 사용할 수 있습니다 시각?

관련 문제