2014-07-19 2 views
1

우선이 시간을내어 읽어 주셔서 감사합니다. 나는 mysql에 관한 몇 가지 질문에 답하려고 노력하고 있으며, 몇 가지에 갇혀있다. 그래서 나는 가능한 한 누군가의 도움을 청한다. 아니면 적어도 올바른 방향으로 나를 가리 키도록. 어떤 도움을 주시면 감사하겠습니다.mysql 성능 쿼리

도시 테이블에는 230 개국의 4000 개 도시에 대한 인구 데이터가 들어 있습니다. 다음 쿼리가 MySQL 5.6에서 제대로 수행되지 않는 이유를 설명하고 솔루션을 설명하십시오.

SELECT `ID`, `CountryCode`, `Name`, `District`, `Population` 
FROM `City` 
WHERE (`CountryCode`, `Population`) IN (
    SELECT `CountryCode`, MAX(`Population`) AS `Population` 
    FROM `City` 
    GROUP BY `CountryCode` 
); 
+0

CITY 테이블에 어떤 인덱스가 있습니까? –

+0

없음 Pieter Geerkens. – user2820879

답변

1

이 쿼리는 하위 쿼리를 한 번만 실행하고 결과를 유지 한 다음 외부 쿼리의 행과 비교한다고 생각할 수 있습니다. 그러나 MySQL에서는 그렇지 않습니다. MySQL은 옵티 마이저의 인텔리전스에 차이가 있기 때문에 하위 쿼리를 종속 하위 쿼리으로 처리하고 외부 쿼리의 고유 한 값마다 다시 실행합니다.

이 문제를 해결하려면 하위 쿼리를 FROM 절로 파생 테이블로 이동하십시오. 하위 쿼리를 한 번 실행하고 결과를 내부 임시 테이블로 유지합니다. 그런 다음 테이블의 다른 인스턴스에 조인하십시오.

SELECT `ID`, `CountryCode`, `Name`, `District`, `Population` 
FROM `City` 
JOIN (
    SELECT `CountryCode`, MAX(`Population`) AS `Population` 
    FROM `City` 
    GROUP BY `CountryCode` 
) AS _max USING (`CountryCode`, `Population`); 

또한 당신은 순서에있는 두 개의 열 (CountryCode,Population) 이상 도시에 인덱스를 가져야한다, 그래서 쿼리 BY 그룹은 효율적으로 실행할 수 있습니다.

+0

감사합니다. Bill Karwin. 나는 당신의 제안을 받아들이고 그것들을 복제하여 개선 사항을 점검 할 것입니다. – user2820879

+0

행운을 빌어 요! 도움이되는지 알려주세요. –

+0

정말 도움이됩니다! Bill Karwin에게 다시 한번 감사드립니다. – user2820879