8.3.6 B-Tree 인덱스의 정렬 및 스캔 방향(~8.3.6.1.1)

조현근·2022년 12월 12일
0
post-thumbnail

모든 내용은 Real MySQL 8.0 1권에서 가져왔습니다!!
8.3.6 B-Tree 인덱스의 정렬 및 스캔 방향

8.3.6 B-Tree 인덱스의 정렬 및 스캔 방향

인덱스를 생성할 때 설정한 정렬 규칙에 따라 인덱스의 키 값은 항상 오름차순이거나 내림차순으로 정렬되어 저장된다. 하지만 정렬된 방향대로 항상 인덱스를 읽는 것은 아니다. 인덱스를 어느 방향으로 읽을지는 쿼리에 따라 옵티마이저가 실시간으로 만들어 내는 실행 계획에 따라 결정된다.

8.3.6.1 인덱스의 정렬

MySQL 5.7 버전까지는 컬럼 단위로 정렬 순서를 혼합(ACS와 DESC 혼합)해서 인데스를 생성할 수 없었다.
하지만 MySQL 8.0 버전부터는 다음과 같은 형태의 정렬 순서를 혼합한 인덱스도 생성할 수 있게 됐다.

CREATE INDEX ix_teamname_userscore ON employees (team_name ASC, user_score DESC);

8.3.6.1.1 인덱스 스캔 방향

first_name 컬럼에 대한 인덱스가 포함된 employees 테이블에 대해 다음 쿼리를 실행하는 과정을 살펴보자

SELECT *
FROM employees
ORDER BY first_name DESC
LIMIT 1;

인덱스는 오름차순으로 정렬돼 있지만 인덱스를 최솟값부터 읽으면 오름차순으로 값을 가져올 수 있고, 최댓값부터 거꾸로 읽으면 내림차순으로 값을 가져올 수 있다는 것을 MySQL 옵티마이저는 이미 알고 있다. 그래서 위 쿼리는 인덱스를 역순으로 접근해 첫 번째 레코드만 읽으면 된다.
아래 그림은 인덱스를 정순으로 읽는 경우와 역순으로 읽는 경우를 보여준다.

[Real MySQL 그림 8.14]

즉, 인덱스 생성 시점에 오름차순 또는 내림차순으로 정렬이 결정되지만 쿼리가 그 인덱스를 사용하는 시점에 인덱스를 읽는 방향에 따라 오름차순 또는 내림차순 정렬 효과를 얻을 수 있다.

profile
안녕하세요!

0개의 댓글