2017-04-04 1 views
0

이것은 질문입니다. 나는 알고 있습니다.하지만 누군가가 나에게 옳은지를 설명하기 위해 설명하고 싶습니다.MYSQL 엔진이 쿼리에서 작동하는 방법

이 간단한 쿼리는 MYSQL이 항상 의미를 왼쪽에서 오른쪽으로 실행합니까?

* Status later comparing c04 and later c05 
* Later groups the results 
* later filters again the result applying the c>1 filter 
* Later sorts and fetch the first 10 results and disposing the others 

에 의해 모든 레코드를 필터링 왼쪽에서 오른쪽으로 또는 다른 최적화 인덱스를 사용하지 가정이에서

SELECT c03,c04,c05,count(*) as c FROM table 
where status='Active' and c04 is not null and c05 is not null 
group by c03,c04,c05 
having c>1 order by c desc limit 10; 

엔진은 내가 Status later comparing c04 and later c05 가능한 인덱스에 따라 생각

답변

1

... 시작 열의 cardinality이 있으며 항상 그 순서로 평가되는 것은 아닙니다. MySQL은 제약 조건을 먼저 평가하려고 시도하는데, 결과 집합을 가장 낮은 비용으로 최대한 줄이게된다. 인덱스가없는 열을 사용하는 제약 조건은 평가가 비싸기 때문에 마지막으로 평가 될 수 있습니다.

나머지는 다른 순서를위한 공간이 거의 없지만 일부 단계에서는 적절한 색인을 통해 이점을 얻을 수 있습니다.

+0

하지만 필터 다음 단계는 무엇입니까? 나중에 그룹화 결과는 * 나중에 c> 1 필터를 적용한 결과를 다시 필터링합니다. * 나중에 처음 10 개의 결과를 정렬하고 가져오고 나머지는 삭제합니다. – chiperortiz

+0

예, 그렇게 생각합니다 (두 번째 단락이 참조하는 것입니다). 적어도 나는 다른 순서로 그것을 할 가능성이 없다. 필터는 그룹화 후에 와야합니다. sorting은'O (n log n)'을 취하는 반면, filter의 복잡성은'O (n)'이기 때문에 sort 전에는 의미가 없다. 그래서 sorter는 sort하기 전에 결과 set을 줄여야한다. 처음 10 행을 선택하는 것은 정렬 후에 만 ​​가능합니다. – GhostGambler

관련 문제