인덱스 퀴즈 해설

[36번] 커버링 인덱스 (1)

index-quiz 2025. 12. 5. 14:17

#36

문제

다음 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 테이블 만을 풀스캔한다는 뜻으로 테이블 스캔이 일어나지 않았음을 알 수 있습니다.