
문제
다음 test_table 테이블이 있다
CREATE TABLE test_table (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT,
address VARCHAR(200),
Index idx_name_age(name, age)
);
다음 쿼리를 실행할 때 실행계획에 대한 서술로 옳은 것을 고르시오.
SELECT name, age FROM test_table WHERE age > 0;
선지
A) idx_name_age를 활용하지 않는다.
B) idx_name_age 인덱스 스캔만 일어나고 테이블 스캔은 일어나지 않는다.
C) idx_name_age를 스캔한 이후, 테이블 스캔이 일어난다.
정답
A) idx_name_age를 활용하지 않는다.
B) idx_name_age 인덱스 스캔만 일어나고 테이블 스캔은 일어나지 않는다.
C) idx_name_age를 스캔한 이후, 테이블 스캔이 일어난다.
핵심 해설
조회하는 name, age 컬럼은 복합인덱스인 idx_name_age 만으로 조회가 가능하기 때문에 인덱스만을 활용하여 결과반환이 가능합니다.
이렇듯 테이블 조회없이 인덱스만으로 결과반환이 가능한 상황을 커버링 인덱스라고 합니다.
상세 해설
현재 test_table의 경우 idx_name_age 인덱스에 있는 B-Tree 정보만을 조회하여 결과를 반환할 수 있습니다.
따라서 테이블 풀 스캔보다 더 빠르고 가벼운 탐색을 보장하는 인덱스 테이블을 풀 스캔하여 탐색합니다.
커버링 인덱스의 조건
커버링 인덱스는 다음 2가지 조건을 만족하는 것을 의미합니다.
- 조회하려는 컬럼이 모두 인덱스에 포함
- Where 조건도 해당 인덱스를 사용가능한 상태
커버링 인덱스의 장점
- 빠른 속도 : 데이터 파일의 접근이 없기 때문에 속도가 매우 빠릅니다.
- 적은 디스크 부담 : 랜덤 I/O를 통해 데이터에 직접 접근하지 않으므로 디스크 부담이 적습니다
실행계획 살펴보기
MySQL 실행계획을 통해 실제로도 커버링 인덱스 상황에서 테이블 스캔이 일어나지 않는지 확인해보겠습니다.
커버링 인덱스여서 인덱스 테이블만으로 결과 반환이 가능할 때 실행계획에는 Using index가 현출됩니다.
+--+-----------+----------+----------+-----+-------------+------------+-------+----+-----+--------+------------------------+
|id|select_type|table |partitions|type |possible_keys|key |key_len|ref |rows |filtered|Extra |
+--+-----------+----------+----------+-----+-------------+------------+-------+----+-----+--------+------------------------+
|1 |SIMPLE |test_table|null |index|idx_name_age |idx_name_age|408 |null|97588|33.33 |Using where; Using index|
+--+-----------+----------+----------+-----+-------------+------------+-------+----+-----+--------+------------------------+
Extra를 보면 Using index를 활용하고 있습니다. 이는 index 테이블 만을 풀스캔한다는 뜻으로 테이블 스캔이 일어나지 않았음을 알 수 있습니다.
'인덱스 퀴즈 해설' 카테고리의 다른 글
| [38번] 커버링 인덱스 (3) (0) | 2025.12.05 |
|---|---|
| [37번] 커버링 인덱스 (2) (0) | 2025.12.05 |
| [35번] 인덱스 루스 스캔 TF (3) (0) | 2025.10.31 |
| [34번] 인덱스 루스 스캔 TF (2) (0) | 2025.10.31 |
| [33번] 인덱스 루스 스캔 TF (1) (0) | 2025.10.31 |