원문

[개발자를 위한 인덱스 생성과 SQL 작성 노하우 이병국 글봄크리에이티브 - 교보문고 (kyobobook.co.kr)](http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788996560081)

indexBook

결합 인덱스의 컬럼 순서 결정방법

대다수의 웹에서 결합 인덱스의 컬럼 순서 결정방법을 다음과 같은 내용을 인용한다.

  1. 항상 WHERE 조건에 사용되는 컬럼인가?
  2. 항상 “=”로 사용되는가?
  3. 분포도가 좋은 컬럼인가?
  4. SORT에 사용되는 컬럼인가?

여기서 3, 4번은 논란이 된다.

항상 WHERE 조건에 사용되는 컬럼인가?

결합 인덱스의 첫 번째 컬럼을 조건에서 사용하지 않는다면, 그 인덱스는 사용되지 않는 경우가 대부분이다. 많은 쿼리에서 공통적으로 사용되는 조건절의 컬럼을 인덱스 선행컬럼에 주로 사용한다. 다수의 쿼리에서 공통적으로 사용된다는 것은 필수 조건절이라는 의미와 동일하다. 이러한 필수 조건절은 결합인덱스의 선행컬럼으로 사용돼야 한다.

항상 ‘=’로 사용되는가?

결합인덱스에서 선행컬럼이 ‘=’조건이 아니라면 후행컬럼 조건에서 ‘=’을 사용하더라도 처리 범위가 줄지 않는다. 조건절에서 ‘=’이 아닌 연산자를 사용하는 첫번째 컬럼까지만 인덱스를 타고, 그 다음 후행컬럼부터는 인덱스를 타지 않고 필터만 한다.

결합인덱스 = 컬럼1 + 컬럼2 + 컬럼3 + 컬럼4 + 컬럼5

위와 같은 결합 인덱스가 있다고 가정했을 때 컬럼3 조건에서 BETWEEN을 사용했다면 컬럼3까지만 인덱스를 타고 결합인덱스의 후행컬럼은 ‘=’조건이 있더라도 인덱스를 타지않고 필터만 한다. 따라서 주문일자, 생산일자, 결제일자 등의 컬럼은 구간조건으로 많이 사용되어 결합 인덱스의 후행컬럼으로 주요 사용된다.

분포도가 좋은 컬럼인가?

여기서 분포도가 좋다는 말은 같은 값이 적은 컬럼을 말한다. 분포도가 좋은 컬럼은 처리 범위를 줄여주므로 결합인덱스의 선행컬럼으로 사용해야 한다고 하는데 맞는 말인가? 만일 분포도가 좋은 선행컬럼이면 결합 인덱스로 사용할 필요는 없고 단일 인덱스로 사용하면 된다. 분포도가 좋은 컬럼은 결합 인덱스의 선행 컬럼 대상이라기 보단 단일인덱스 컬럼 선정의 중요한 고려사항이다.

결합인덱스 : 선행컬럼(분포도 나쁨) + … + 후행컬럼(분포도 좋음)

결합 인덱스는 여러 컬럼을 합쳐서 처리 범위를 줄인다는 의미도 있지만, 다수의 단일인덱스를 대체하는 공통의 인덱스라는 의미도 있다. 분포도라는 말을 다른 단어로 바꾸자면 다음과 같이 말할 수 있다.

결합인덱스 : 선행컬럼(대분류) + … + 중간컬럼(중분류) + … + 후행컬럼(소분류)

소트에 사용되는 컬럼인가?

소트에 사용됐다고 결합인덱스의 선행컬럼으로 반드시 사용해야 하는 것은 아니다. 결합 인덱스는 결합된 컬럼의 순서로 정렬, 저장되므로 소트에 사용되는 컬럼의 결합인덱스의 일부분일 수는 있으나, 선행컬럼의 조건일 수는 없다. 오히려 소트에 사용되는 컬럼은 결합인덱스 후행컬럼에 자주 사용된다.

인덱스는 기본적으로 위치(조건) 정보와 순서(정렬) 저옵의 특성을 동시에 가지고 있다. 따라서 결합인덱스에는 위치정보를 갖고 있는 컬럼도 있고, 순서 정보를 갖고 있는 컬럼도 있다. 결합 인덱스는 다음과 같은 규칙으로 구성돼야 한다.

  1. 위치정보 컬럼만으로 구성할 수 있다. 혹은 순서정보 컬럼만으로 구성할 수 있다.
  2. 위치정보 컬럼과 순서정보 컬럼의 순으로 구성할 수 있다.
  3. 위치정보 컬럼과 순서정보 컬럼의 순서는 혼재돼서는 안 되며 뒤바뀌어도 안 된다.

결론

결합인덱스의 컬럼 순서 결정방법은 다음과 같다.

  • 공통적으로 자주 사용하는 필수 조건절 컬럼을 우선한다.
  • ’=’ 조건의 컬럼을 다른 연산자 컬럼보다 우선한다.
  • 대분류 -> 중분류 -> 소분류 컬럼순으로 분류한다.
  • 위치(조건) 정보 컬럼은 순서(sort) 정보 컬럼보다 우선한다.