
문제
다음 employees 테이블이 있다
CREATE TABLE employees (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no),
);
CREATE INDEX ix_firstname ON employees (first_name ASC);
다음 쿼리는 ix_firstname 인덱스를 활용하는가?
SELECT * FROM employees ORDER BY first_name DESC LIMIT 5;
선지
A) 활용한다
B) 활용하지 않는다
정답
더보기
A) 활용한다
B) 활용하지 않는다
핵심 해설
인덱스는 순차스캔 뿐만 아니라 역으로 정렬하는 역순스캔도 가능합니다.
따라서 오름차순으로 정렬되어 있는 ix_firstname을 역순으로 스캔하며 DESC에 대한 결과를 반환할 수 있습니다.
상세 해설
인덱스와 역순 스캔
ix_firstname은 기본적으로 오름차순으로 정렬되어 있는 B-Tree 구조입니다. ORDER BY firstname DESC는 그 순서를 역순으로 따라가는 것이므로 MySQL은 뒤에서부터 스캔하며 정렬된 데이터를 가져오게 됩니다.

이 과정에서 MySQL은 테이블의 별도 정렬연산없이 인덱스 만으로 결과를 가져오기 때문에 여전히 인덱스를 활용한 탐색이 훨씬 쿼리비용이 저렴하다고 판단합니다.
실습으로 알아보기
MySQL 실행계획을 통해 실제로도 ix_firstname 인덱스를 활용한 역순스캔이 발생하는지 알아보겠습니다.
+--+-----------+---------+----------+-----+-------------+------------+-------+----+----+--------+-------------------+
|id|select_type|table |partitions|type |possible_keys|key |key_len|ref |rows|filtered|Extra |
+--+-----------+---------+----------+-----+-------------+------------+-------+----+----+--------+-------------------+
|1 |SIMPLE |employees|null |index|null |ix_firstname|58 |null|5 |100 |Backward index scan|
+--+-----------+---------+----------+-----+-------------+------------+-------+----+----+--------+-------------------+
Extra : Backward index scan 컬럼을 통해 인덱스 역순 스캔이 일어나고 있음을 확인할 수 있습니다
'인덱스 퀴즈 해설' 카테고리의 다른 글
| [46번] 인덱스 정순스캔 vs 역순 스캔 (1) | 2025.12.12 |
|---|---|
| [45번] 인덱스 정렬 (3) (0) | 2025.12.12 |
| [43번] 인덱스 정렬 (1) (0) | 2025.12.12 |
| [42번] 인덱스 스킵 스캔(2) (0) | 2025.12.05 |
| [41번] 인덱스 스킵 스캔(1) (0) | 2025.12.05 |