Real MySQL 8.0

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

pwhee 2023. 2. 19. 04:36

10.3.5 type 컬럼

MySQL 서버가 각 테이블의 레코드를 어떻게 읽었는지 알 수 있다.

ALL: 풀 스캔 -> 가장 성능이 안좋음

index_merge 를 제외하고 모두 하나의 인덱스를 탄다.

12가지 타입이 있다.

[1] system

InnoDB에는 없다. 레코드 0, 1 인 테이블을 읽는 방식

[2] const

테이블 레코드 수, 조인 순서와 관계없이 유니크 키(PK) 컬럼을 이용해서 동등 비교로 조회할 때 사용하는 방식. 한 건의 레코드를 반환해서 const 라고 한다.

[3] eq_ref

여러 테이블의 조인에서 표시되는 타입.

조인에서 두 번째 이후에 읽는 테이블에서 반드시 1건만 조회된다는 보장이 있을 때 사용 가능한 방식.

첫번째 읽은 컬럼 값이 두번째 테이블의 유니크 키 또는 PK가 된다.

[4] ref

동등 조건으로 조인된 쿼리에서 나타나는 방식.

eq_ref와 다르게 조인 순서가 상관 없다. 그만큼 eq_ref보다 느리지만 그래도 동등조건만으로 비교되므로 빠르다.

[5] fulltext

Full-text Search 인덱스를 사용해 레코드를 읽는 접근 방법.

사용하기 위해서는 Full-text Search 인덱스가 이미 정의된 상태이어야한다. 

[6] ref_or_null

ref + IS NULL

[7] unique_subquery

WHERE 절의 IN (SUBQUERY)형태의 쿼리에 사용.

서브쿼리에 중복되지 않는 유니크한 값만 반환될 때 사용되는 접근 방법.

[8] index_subquery

IN (...) 에 오는 안쪽 파라메터는 중복된 값을 필터링할 필요가 있다. 파라메터로 서브쿼리가 사용되고, 인덱스를 이용해서 중복된 결과를 제거할 수 있을 때 사용되는 방식. 중복을 처리한다는 점에서 unique_subquery와 다르다.

[9] range

인덱스 레인지 스캔 형태의 접근 방식. 인덱스를 사용해서 범위 검색. 우선순위는 낮지만 상당히 빠른 방식.

[10] index_merge

2개 이상의 인덱스로 각각의 결과를 내고, 서로 합치는 접근 방식

[11] index

인덱스 풀 스캔. 효율적으로 필요한 부분만 읽는 방식이 아니다.

[12] ALL

풀 스캔.

 

10.3.6 possible_keys 컬럼

최적의 실행 계획을 만들기 위해 사용될 뻔한 키들의 목록. 별로 볼 필요 없다.

 

10.3.7 key 컬럼

최종 선택된 실행 계획에서 사용되는 인덱스의 목록. 쿼리 튜닝 시 여기 목록의 인덱스를 확인해서 의도 했던 인덱스가 표시되는지 체크한다.

실행 계획 타입이 ALL인 경우, 인덱스를 활용하지 못하므로 key 컬럼은 NULL.