Real MySQL 8.0

[Real MySQL 8.0] 10.3 실행 계획 분석

pwhee 2023. 2. 25. 15:29

[23] Using index condition

옵티마이저가 인덱스 컨디션 푸시 다운 최적화를 사용할 때 표시된다.

 

[24] Using index for group-by

정렬된 인덱스를 읽어서 순서대로 그루핑작업만 하면 될때 표시된다. -> 따로 정렬작업이 필요없기때문에 효율적

단순히 인덱스를 쭉 읽는 방법과, 필요한 부분만 읽는 방법이 있다

- 타이트 인덱스 스캔을 통한 GROUP BY 처리

AVG(), SUM(), COUNT()는 전부 다 읽어야한다. 이경우 단순히 GROUP BY를 위해 인덱스를 이용하지만, 루스 인덱스 스캔은 아니다. 실행계획에서 Using index for group-by가 표시되지 않는다.

- 루스 인덱스 스캔을 통한 GROUP BY 처리

MIN(), MAX() 는 맨앞, 맨뒤 레코드만 읽으면 된다. 루스 인덱스 스캔 적용가능.

이때 GROUP BY 조건에 인덱스를 사용할지 아래와 같이 결정된다.

1) WHERE 조건절이 없을 때: GROUP BY 절의 컬럼과 SELECT로 가져오는 컬럼이 루스 인덱스 스캔을 사용할 수 있는 조건을 갖추면된다. 그렇지 못할 때는 타이트 인덱스 스캔, 혹은 별도의 정렬이 필요

2) WHERE 조건절이 있지만 검색을 위해 인덱스 사용이 불가능할 때: 루스 인덱스 스캔 사용 불가능. 먼저 GROUP BY를 위해 인덱스를 읽은 후, WHERE 조건 비교를 위해 해당 레코드를 읽어야한다.

3) WHERE 조건절이 있고, 검색을 위해 인덱스 사용이 가능할 때: 하나의 쿼리에는 하나의 인덱스만 사용 가능(index merge 제외). WHERE에도 GROUP BY에도 인덱스 사용이 가능하면 둘다 똑같은 인덱스를 공통으로 사용할 때만 루스 인덱스 스캔 사용 가능. 그렇지 않은 경우 옵티마이저는 WHERE 절의 인덱스를 선택하는 경향이 있다.

 

[25] Using index for skip scan

인덱스 스킵 스캔 사용할 때 표시된다. (복습)

 

[26] Using join buffer(Block Nested Loop), Using join buffer(Batched Key Access), Using join buffer(hash join)

조인할 때 옵티마이저는 인덱스가 걸린 테이블을 드리븐 테이블로 고른다(드리븐 테이블 조회의 오버헤드가 크기 때문). 드리븐 테이블에 적절한 인덱스가 없을 때 블록 네스티드 루프 조인 또는 해시 조인을 사용한다. 이경우 조인 버퍼를 사용하므로 Using join buffer라는 메시지가 Extra 컬럼에 표시된다.