본문 바로가기

기초 지식/DB

DB의 결합 인덱스에 관해서

분명히 결합인덱스에 포함이 되어있는데 왜 인덱스를 타지 않지??!

 

최근에 일을 진행하면서 기존 쿼리가 인덱스를 여러개 추가했음에도 인덱스를 사용하지 않고 Table Full Scan을 하는 경우가 발생했습니다.

 

문제의 원인은 인덱스를 여러개를 충분히 추가해두긴 했지만 결합인덱스에서 우선 설정되지 않은 컬럼으로 조회 조건이 적용되면서 발생한 이슈였습니다.

 

이번 일로 인해 결합인덱스에 대해 공부가 필요할 것 같아서 간단하게 정리해보겠습니다.

 

결합인덱스 (Composite Index)

결합인덱스란 복수의 컬럼으로 구성된 인덱스로 복수의 컬럼으로 묶었을 때 데이터 분포도가 좋아지는 경우 사용됩니다.

 

//결합 인덱스 생성 구문 예시
CREATE INDEX idx_composite_index_1
ON Test(id, test_name, test_date)

 

결합인덱스의 컬럼 정하기

결합인덱스는 컬럼에 따른 데이터 분포도와 인덱스에 사용되는 컬럼의 순서에 따라서도 성능에 영향을 받습니다.

그중에서도 첫번째 컬럼이 많은 역할을 합니다. 어떠한 요소를 기준으로 첫번째 컬럼을 설정을 해야하고 순서를 짜야하는지 알아봐야겠습니다.

 

  1. 조회조건에 항상 포함되는 경우
    • 결합인덱스의 첫번째 컬럼이 조건에 사용되지 않으면 그 결합인덱스는 선택되지 않는다.
  2. 첫번째 컬럼으로 최대한 많이 필터링을 할 수 있는 경우
    • 결합인덱스의 첫번째 컬럼으로 처리 범위를 산정하기 때문에 최대한 많은 필터링을 처리하도록 결정하는 것이 좋다.
  3. '=' 조건으로 사용되는 경우
    • 결합인덱스의 첫번째 컬럼이 '=' 조건이 아니라면 이후의 조건에서 '='을 사용하더라도 처리범위는 줄어들지 않는다.
    • '='이 아닌 조건을 사용하는 첫번째 컬럼의 경우 첫번째 컬럼만 인덱스를 타고(부분 인덱스), 이후의 컬럼은 인덱스를 타지 않는다.
  4. AND 조건으로 검색되는 경우
    • 결합인덱스에 사용되는 복수의 컬럼이 AND 조건으로 검색되는 경우에 성능에 좋은 영향을 미친다. 하지만 OR로 사용되는 경우에는 결합인덱스를 사용하면 안된다.

 

위와 같은 조건들을 고려하여서 결합인덱스를 생성해야합니다.

 

그리고 가장 위에서 발생했던 이슈는 컬럼을 정하는 조건 중 (1)번, 쿼리의 조건절에서 결합인덱스의 첫번째 컬럼이 빠진채 후행 컬럼들만 사용해서 인덱스 적용이 안되는 것이였습니다. 아주 간단한 문제인데도 지식이 부족해서 고민했네요 ㅎㅎ

 

 

반응형