인덱스 퀴즈 해설

[44번] 인덱스 정렬 (2)

index-quiz 2025. 12. 12. 00:59

#44

문제

다음 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 컬럼을 통해 인덱스 역순 스캔이 일어나고 있음을 확인할 수 있습니다