HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

결합 인덱스 컬럼 순서(Composite Index Column Ordering)

DB에는 인덱스(Index)라는 개념이 있습니다. 주로 쓰는 비유로는 DB 테이블을 "책"이라고 했을 때, 인덱스는 "색인"이 됩니다. 알아보고 싶은 정보의 키워드를 이용해 색인을 검색하면 더욱 빠르게 정보를 찾아낼 수 있지요. 인덱스의 개념은 구루비 DB 스터디 - 인덱스의 선정(BY-NC-SA)에서 확인해 보세요. 이번 포스팅의 정보도 해당 게시글에서 부분 차용 되었습니다.

Composite Index

이번 포스팅은 인덱스 중에서도 결합 인덱스(Composite Index)에 대해 알아보려고 합니다.

결합 인덱스는 단일 인덱스로도 성능이 나오지 않게 되는 경우 만들어봄직 합니다. 분포도가 나쁜 컬럼들을 결합 할 때 분포도가 좋아지게 되면 결합 인덱스가 되는 경우도 있을겁니다. 그리고 결합 인덱스는 생성도 중요하지만 결합할 컬럼들간의 순서도 매우 많은 영향을 끼칩니다.

Column Ordering

컬럼간의 우선 순위를 지정할 때 고려해야할 사항을 알아봅시다. 앞에 나오는 사항일수록 우선 순위가 높은 사항입니다.

항상 사용하는지?

가장 중요 할 수도 있는 사항인데 항상 사용하는가?에 대한 여부입니다. 사용하지도 않는 컬럼을 결합 인덱스로 만들어선 곤란하겠습니다. 가능하면 항상 사용할 것 같은 컬럼을 선택합니다. 또한 결합인덱스의 첫번째 컬럼을 사용하지 않으면 인덱스는 사용 되지 않습니다.

'='으로 사용하는지?

SQL 쿼리 작성시에 '='로 지정할 수 있는 컬럼이 선행이 되어야 합니다. 예를 들자면 아래와 같은 SQL 쿼리가 있다고 가정합니다.

select col1, col2
from tbl_dummy
where col1 like 'A%'
and col2 = '20150707'

위와 같은 쿼리에서 col1, col2를 결합 인덱스로 만든다고 가정한다면 col2가 선행이 되어야 합니다. (어디까지나 예시입니다. ㅜㅜ)

결합 인덱스의 선행 컬럼이 '=' 비교를 하지 않는 경우 후행 컬럼이 '=' 비교일지라도 처리할 범위는 줄어 들지 않습니다. 따라서 위의 쿼리처럼 col1(Range 비교), col2(Point 비교) 순으로 잦은 비교를 한다고 가정시 결합 인덱스 생성을 col1, col2 순서로 하면 유리한 점이 없습니다.

분포도가 좋은지?

분포도가 좋은(분포도 값이 낮은) 컬럼이 선행 되어야 합니다.

자주 정렬 되는지?

자주 정렬 되는 컬럼이라면 선행이 되어야 합니다.

부가적으로 추가할 컬럼이 있다면?

말 그대로 부가적으로 추가할 컬럼이 있다면 추가합니다.

Closing Remarks

오묘한 DB의 세계입니다. 공부 더 열심히 해야겠어요.