인덱스 퀴즈 해설

[37번] 커버링 인덱스 (2)

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

#37

문제

다음 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 id, 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를 스캔한 이후, 테이블 스캔이 일어난다.

 

핵심 해설

 

이 문제의 핵심은 조회하는 컬럼인 id, name, age가 복합인덱스 idx_name_age 테이블에서 모두 조회가능한 커버링 인덱스 상황인지 판단하는 것입니다. MySQL InnoDB 세컨더리 인덱스의 경우 인덱스 키 값과 함께 클러스터링 인덱스를 함께 가지고 있습니다.

 

따라서 해당 쿼리는 조회하는 컬럼을 모두 idx_name_age 테이블 내에서 반환가능한 커버링 인덱스 상황이므로 추가적인 테이블 스캔이 일어나지 않습니다.

 

상세 해설

사용자가 지정한 인덱스 B-Tree 구조의 리프노드에는 데이터의 PK가 저장되어 있습니다.

따라서 해당상황도 인덱스 테이블 만으로 조회가 가능한 커버링 인덱스 상황입니다.

 

실행계획 살펴보기

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