1. 인덱스 스캔 방향은 무조건 오름차순으로 이루어지는가?
- No, 인덱스는 항상 오름차순으로 정렬돼 있지만 인덱스를 최솟값부터 읽으면 오름차순으로 값을 가져올 수 있다. 최댓값부터 거꾸로 읽으면 내림차순으로 값을 가져올 수 있다는 것을 MySQL 옵티마이저는 이미 알고있다.
2. 인덱스 스캔
- 내림차순 인덱스 : 큰 값의 인덱스 키가 B-Tree의 왼쪽으로 정렬된 인덱스
- 인덱스 역순 스캔 : 인덱스 키의 크고 작음에 관계없이 인덱스 리프 노드의 오른쪽 페이지부터 왼쪽으로 스캔
- 오름차순 인덱스 : 작은 값의 인덱스 키가 B-Tree의 왼쪽으로 정렬된 인덱스
- 인덱스 정순 스캔 : 인덱스 키의 크고 작음에 관계없이 인덱스 리프 노드의 왼쪽 페이지부터 오른쪽으로 스캔
3. 인덱스 역순 스캔이 인덱스 정순 스캔에 비해 느릴 수 밖에 없는 이유
- 페이지 잠금이 인덱스 정순 스캔에 적합한 구조
- 페이지 내에서 인덱스 레코드가 단방향으로만 연결된 구조
- 정순 스캔 시:
- 페이지 내에서 첫 번째 레코드를 찾습니다.
- Next Record 포인터를 따라 순차적으로 다음 레코드를 읽습니다. 매우 빠르고 효율적입니다.
- 페이지의 끝에 도달하면, 페이지의 Next Page 포인터를 따라 다음 페이지로 이동합니다.
- 역순 스캔 시:
- 페이지 내에서 마지막 레코드를 찾습니다.
- 이전 레코드를 가리키는 포인터가 없기 때문에, 이전 레코드를 찾기 위해 페이지 내의 레코드 리스트를 비효율적으로 탐색하거나 추가적인 연산이 필요합니다.
- 이 과정이 모든 레코드마다 반복되므로 CPU 작업량이 증가하고 성능이 저하됩니다.
- 페이지의 시작에 도달하면, 페이지의 Prev Page 포인터를 따라 이전 페이지로 이동합니다.
4. ORDER BY ... DESC가 매우 빈번하고 성능에 민감한 쿼리라면?
- 내림차순 인덱스(CREATE INDEX ... (col DESC))를 생성하는 것이 근본적인 해결책이다.
내림차순 인덱스를 만들면, DESC 쿼리도 가장 효율적인 '정순 스캔'으로 처리할 수 있다.
'CS' 카테고리의 다른 글
도메인 주도 설계 정리 - ENTITY, VALUE OBJECT (1) | 2025.06.26 |
---|---|
RealMySQL - REAPEATABLE READ (0) | 2025.06.22 |
Spring 테스트에서 @Transactional과 비관적 락 사용 시 주의점 (2) | 2024.10.14 |
스프링부트 JPA 모범 사례 - @ManyToMany 연관관계를 효과적으로 구성하는 방법 (0) | 2024.08.23 |
[JAVA] String.valueOf()와 toString()의 차이에 대해서 알아보자 feat. Effective Java (0) | 2024.06.07 |