데이터베이스/MySQL

B-Tree 인덱스의 가용성

PSW 2025. 3. 17. 20:34

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