이 Type은 조인 타입이라고도 한다. 항상 Join절을 사용하는것도 아닌데 왜 조인타입이라고 할까?
MySQL은 항상 한 테이블씩 읽고 읽은 테이블을 이전 테이블과 조인하는 방식으로 전체 쿼리를 수행하기 때문에, 쿼리에 JOIN절이 없어도 내부적으로 조인처럼 처리되기 때문.
system
1행만 있는 테이블. 최상.
const
PK/Unique = 상수. 실행 전에 결과 결정.
eq_ref
조인에서 PK/Unique로 1:1 매칭. 가능한 가장 효율적인 조인 방식임.
eq_ref는 조인 시, 왼쪽 테이블의 한 행마다 오른쪽 테이블에서 정확히 1개의 행만 찾는 경우 사용되는 조인 타입이다. 즉, Unique Lookup 형태의 조인이다.
unique_subquery
IN (subquery) 가 고유 인덱스로 최적화된 경우. (반대는 index_subquery)
ref
비고유 인덱스 동등 비교 (쉽게 말해 인덱스를 쓰긴 쓰는데 그게 유니크하지않음 → 중복된 값이 있을 수 있음. → 여러개 row가 매칭될 수 있음.)
비고유 인덱스 동등 비교는 그냥 비고유한 인덱스로 where절에 동등(=) 한 조건으로 탐색했다는 것.
WHERE 또는 JOIN 조건에서 동등(equality =) 비교가 사용됨
예: WHERE col = ?
그 컬럼에 인덱스가 있음
그 인덱스가 unique하지 않거나, unique 인덱스라도 조건이 인덱스 전체를 고유하게 결정하지 못할 때
ref_or_null
ref + NULL 포함 탐색.
range
인덱스 범위 탐색 (<, >, BETWEEN, IN).
index_subquery
IN (subquery) 가 비고유 인덱스 기반.
index_merge
여러 인덱스 병합 사용(OR 등). 상황 의존.
index
인덱스 전체 스캔(Full Index Scan).
인덱스 풀 스캔. 인덱스가 있긴 한데, 조건을 제대로 주지 않으면 모든 인덱스를 다 읽는다. where조건에 인덱스가 없을 때. Join의 on에 인덱스를 조건으로 주지 않을 때 등.
ALL
테이블 전체 스캔(Full Table Scan).
FULLTEXT *
MATCH ... AGAINST 전용. B-Tree와 직접 비교 곤란(특수 목적).
💡 const와 eq_ref의 차이는, const는 그냥 단일 테이블에서 조건절에 PK로 행찾는거고, eq_ref는 Join사용할때 조건절에 PK나 FK등의 유니크한 값으로 비교하는 것.