2013-02-25 2 views
4

쿼리를 최적화 할 수있는 방법은 'resulta'테이블에 약 500k 레코드가있는 약 2 초가 걸리지 만, touble가 sevaral 수십억으로 증가 할 것으로 예상합니다.filesort를 사용하는 MySQL의 평균 평균 사용량이 가장 느림

SELECT 
    hopcount, hop, round(avg(rtt) , 2) AS avg, min(rtt) AS min, max(rtt) AS  max 
FROM results 
JOIN traces ON id = trace 
WHERE target =9 
AND rtt > -1 
GROUP BY hop` 

설명 출력 :

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE traces ref PRIMARY,fk_traces_1_idx fk_traces_1_idx 5 const 26333 Using where; Using temporary; Using filesort 
1 SIMPLE results ref trace trace 5 pinger.traces.id 7 Using where 

테이블 : MySQL의에서

CREATE TABLE IF NOT EXISTS `results` (
    `hop` int(11) DEFAULT NULL, 
    `trace` int(11) DEFAULT NULL, 
    `rtt` int(11) NOT NULL, 
    `seq` int(11) NOT NULL, 
    KEY `trace` (`trace`), 
    KEY `fk_hops_id` (`hop`), 
    KEY `seq` (`seq`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
    CREATE TABLE IF NOT EXISTS `traces` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `hopcount` smallint(6) NOT NULL, 
    `target` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_traces_1_idx` (`target`,`id`,`time`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=52308; 
+0

에 당신은 아마이 더욱 최적화 할 수있을 것입니다. http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html 및 http://www.xaprb.com/blog/2006/07/04/how- to-exploit-mysql-index-optimizations/도움이 되었으면 좋겠다. –

답변

2

, GROUP BY는이 암시 종류를 제거 추가하려면 ORDER BY

을 의미 ORDER BY NULL

당신이 GROUP BY 사용하는 경우 6,

이이 MySQL docs for SELECT

에서 언급 한 동일한 열의에 의해 주문을 가진 것처럼, 출력 행은 열 BY 그룹에 따라 정렬됩니다. GROUP BY가 생산하고 정렬의 오버 헤드를 방지하려면 NULL에 의해 추가 주문 :

그리고 당신은 더 나은 클러스터 된 기본 키를 정의하는 경우도 ORDER BY Optimization

+0

고마워, 2 초에서 1.3으로 시간이 줄어들었고 더 이상 파일롯을 사용하지 않았지만 여전히 나에게 느리다. 더 이상 아이디어를 최적화하는 방법? – Zmejs

+0

나는 틀린 것으로 입증되고 싶지만 헌신적 인 요약 테이블을 만들지는 못한다. 나는 그것이 당신이 얻는만큼 좋다고 생각한다. – Strawberry

+0

일부 인덱스는 어떻게됩니까? – fedorqui