EXPLAIN
SELECT 구문
종류 | 설명 |
---|---|
system | 하나의 컬럼만 갖는 특수한 const 방식 |
const | 조인 없이 유니크 인덱스를 탄 쿼리의 결과 행 (Row) 건수가 1개로 예상될 때 Index Unique Scan ✅ 적용 조건 : Where절에서 PK나 Unique 인덱스를 동등 비교 (=) ❗ 쿼리 실행 전에 결과가 1건임을 예측할 수 있어야 합니다. |
eq_ref | 조인 수행 후 유니크 인덱스를 탄 쿼리의 결과 행 (Row) 건수가 1개로 예상될 때 ✅ 적용 조건 : 조인 시 Where절에서 테이블1의 컬럼값과 테이블2의 PK 또는 Unique 인덱스를 동등 비교 (=) ex: SELECT * FROM t1, t2 WHERE t1.id = t2.id 💬 const 방식과 유사하되, 조인 조건에 const가 쓰인 경우라 할 수 있습니다. |
ref | 결과 Row 건수는 알 수 없지만 쿼리가 일반 인덱스를 탔을 때 ✅ 적용 조건 : Where절에서 일반 인덱스를 동등 비교 (=) ❗ 조인 여부와는 무관합니다. |
fulltext | 쿼리가 전문 (fulltext) 검색 인덱스를 탔을 때 |
ref_or_null | ref 방식의 조건에서 Null 비교가 추가됐을 때 ✅ 적용 조건 : Where절에서 일반 인덱스 동등 비교 (=) + Null 비교 |
unique_subquery | Where절에 IN (서브쿼리) 를 사용한 상태에서 Where절의 서브쿼리 결과가 모두 Unique할 때 |
index_subquery | Where절에 IN (서브쿼리) 를 사용한 상태에서 Where절의 서브쿼리 결과의 중복을 인덱스로 제거할 수 있을 때 |
range | 인덱스를 범위 비교했을 때 Index Range Scan ✅ 적용 조건 : Where절에서 인덱스를 범위 비교 ex) <, >, BETWEEN, IN, LIKE, IS NULL 등 |
index_merge | 2개 이상의 인덱스를 이용해 각각 검색 후, 결과를 하나로 합칠 때 추가 학습 필요 |
index | const, ref, range 방식을 적용할 수 없어 인덱스를 처음부터 끝까지 읽어야 하는 경우 Index Full Scan ✅ 적용 조건 ① 데이터 파일을 읽지 않고, 인덱스 컬럼으로 처리 가능한 경우 ② 또는 인덱스로 정렬, 그룹핑 작업을 대체할 수 있는 경우 ❗ Limit와 함께 사용하면 효율 개선 |
ALL | 인덱스를 탈 수 없어 전체 테이블을 읽어야할 때 Table Full Scan |
❗ 다중 컬럼 PK 동등 비교 (=) 시
① 전체 컬럼 비교 : const 적용
② 첫번째 컬럼을 포함한 일부 컬럼 비교 : ref 적용
③ 첫번째 컬럼 포함 ❌ 일부 컬럼 비교 : ALL 적용
용어
카디널리티
테이블 Row 개수에 비해
컬럼의 카디널리티가 높다 = 컬럼 값 중복이 적다
참고 자료
[MySQL] 실행계획 (Execution Plan) - (2) type | 테드의 기술블로그
RealMysql 6장 실행계획 정리 | Myanglog