B-Tree 인덱스의 특징은 왼쪽 값에 기준해서(Left-most) 오른쪽 값이 정렬돼 있다.
B-Tree를 사용한 DB의 인덱스는 정렬된 트리 구조를 가지고 있다. 이때, 다중 칼럼(Composite) 인덱스를 사용할 경우, 왼쪽(Left-most) 값이 기준이 된다는 개념이다.
CREATE INDEX idx_ab ON table_name (A, B);
-> 이렇게 (A, B) 복합(Composite) 인덱스를 만들면, B-Tree 인덱스는 A 열을 먼저 정렬한 후, 같은 A 값을 가진 경우 B를 정렬해
EX)
A | B | 값 |
1 | 2 | X |
1 | 3 | Y |
1 | 4 | Z |
2 | 1 | A |
2 | 4 | B |
2 | 5 | C |
3 | 2 | D |
3 | 3 | E |
3 | 4 | F |
이 개념을 이해하면 인덱스를 제대로 활용할 수 있는 쿼리와 비효율적인 쿼리를 구별할 수 있다.
기본적으로 B-Tree 인덱스의 특성상 아래 조건에서는 사용할 수 없다.
- NOT-EQUAL로 비교된 경우("<>", "NOT IN", "NOT BETWEEN", "IS NOT NULL")
- ..WHERE column <> 'N'
- ..WHERE column NOT IN (10, 11, 12)
- ..WHERE column IS NOT NULL - LIKE '%??'(앞부분이 아닌 뒷부분 일치)형태로 문자열 패턴이 비교된 경우
- ..WHERE column LIKE '%승환'
- ..WHERE column LIKE '_승환'
- ..WHERE column LKE ' %승&' - 스토어드 함수나 다른 연산자로 인덱스 칼럼이 변형된 후 비교된 경우
- ..WHERE SUBSTRING(column, 1, 1) = 'X'
- ..WHERE DAYOFMONTH(column) = 1 - NOT-DETERMINISTIC 속성의 스토어드 함수가 비교 조건에 사용된 경우
- ..WHERE column = deterministic_function() - 데이터 타입이 서로 다른 비교(인덱스 칼럼의 타입을 변환해야 비교가 가능한 경우
- ..WHERE char_column = 10 - 문자열 데이터 타입의 콜레이션이 다른 경우
- ..WHERE utf8_bin_char_column = euckr_bin_char_column
정리
- B-Tree에서 인덱스는 "왼쪽(Left-most)칼럼"을 기준으로 먼저 정렬된다.
- 왼쪽 칼럼(A)로 먼저 필터링한 후, 같은 값에서 오른쪽 칼럼(B)으로 정렬된다.
- 인덱스를 제대로 활용하려면 "왼쪽 칼럼을 먼저 검색"하는 게 중요하다.
- B 칼럼만 단독으로 검색하면 인덱스를 효과적으로 사용할 수 없다.
'데이터베이스 > MySQL' 카테고리의 다른 글
드라이빙 테이블(Driving Table)이란? (0) | 2025.03.20 |
---|