😀우선 관련 참고 포스팅을 검색하는데 있어 복합인덱스(Composite Index)를 결합인덱스라고 표현하는 포스팅이 굉장히 많았다.
물론 한국어의 입장에서 복합과 결합의 의미는 같을 수 있으나, 가끔 영문의 오역으로 인한 결합인덱스가 Composite Index가 아닌 Joined Index로 검색되는 경우도 확인되었다. 따라서 이 포스팅에서는 결합인덱스라는 표현은 사용하지 않겠다.
😀이전 포스팅 인덱스에 이어서 복합인덱스에 대해서 알아보자.
복합 인덱스(Composite Index)는 데이터베이스에서 여러 개의 컬럼(열)들을 조합하여 인덱스를 생성하는 것을 말한다.
단일 인덱스(Single Index)가 한 개의 컬럼에 대해 생성되는 것과는 달리, 복합 인덱스는 여러 개의 컬럼을 함께 사용하여 인덱스를 생성한다.
❓인트로에 설명하던 결합인덱스(Joined Index)는 무엇일까?
😀예를 들어, 고객 정보 데이터베이스에서 고객 이름과 주소를 검색하는 경우를 생각해보자.
만약 단일 인덱스로 이름과 주소를 모두 인덱싱한다면, 데이터베이스는 인덱스에서 해당되는 모든 레코드를 검색하고 필터링하는 데 많은 시간이 소요될 것이다.
하지만 복합 인덱스를 사용하면 고객 이름과 주소 열을 통합하여 하나의 인덱스로 만들 수 있다.
이렇게 하면 데이터베이스는 해당 인덱스를 사용하여 더 빠르게 필요한 레코드를 검색할 수 있게 된다.
이처럼 복합 인덱스를 사용하였을 때 검색속도를 더 높일 수 있으며 그 외에도 여러 장점을 갖고 있다.
복합 인덱스는 장점을 나열하면 다음과 같다.
검색 속도 개선
여러 개의 컬럼을 동시에 검색할 수 있기 때문에 검색 속도가 개선할 수 있다.
데이터 정렬의 효율성
인덱스를 생성할 때 여러 개의 컬럼을 함께 사용하면 정렬을 할 때 더 효율적으로 할 수 있다.
인덱스의 용량 절감
인덱스를 생성할 때 여러 개의 컬럼을 함께 사용하면 인덱스의 용량이 줄어든다.
쿼리 최적화
복합 인덱스는 여러 개의 컬럼을 함께 사용하기 때문에, 쿼리가 여러 개의 조건을 가지고 있을 때 최적화된 실행 계획을 수립할 수 있다.
😀그렇다면 어떤 컬럼을 선택하는게 복합인덱스를 사용하기 좋을까?
where절에서 and 조건으로 자주 통합되어 사용되면서 각각의 분포도 보다 두 개 이상의 컬럼이 통합될 때 분포도가 좋아지는 컬럼들
다른 테이블과 조인의 연결고리로 자주 사용되는 컬럼들
order by에서 자주 사용되는 컬럼들
하나 이상의 키 컬럼 조건으로 같은 테이블의 컬럼들이 자주 조회될 때
복합인덱스를 사용할 땐 아래와 같은 주의점을 요구하게 된다.
⛔복합 인덱스는 일반적으로 WHERE 절에 자주 사용되는 컬럼들로 구성되는데,
인덱스를 생성하는 컬럼의 개수가 많아질수록 인덱스의 성능은 떨어질 수 있다.
⛔복합 인덱스를 생성할 때는 인덱스 생성 순서도 고려해야 한다.
쿼리문 작성 시 복합 인덱스를 사용하고자 한다면 반드시 복합 인덱스의 컬럼 중 선행하는 컬럼부터 조건에 지정하여 사용하여야 한다. 주로 자주 이용되는 순서대로 복합 인덱스 컬럼의 순서 결정한다.
⭕인덱스 생성 순서는 WHERE 절에서 먼저 사용되는 컬럼을 앞쪽에 위치시키는 것이 좋다.
이렇게 함으로써, 인덱스를 탐색할 때 필요한 레코드 수가 최소화시킬 수 있다.
😀복합 인덱스를 만들고 사용하는 방법은 데이터베이스 종류에 따라서 다소 차이가 있을 수 있지만, 일반적으로 따르는 절차는 비슷하다.
인덱스를 생성할 테이블과 컬럼을 선택
인덱스를 생성할 컬럼의 순서를 결정.
검색 조건에서 자주 사용되는 컬럼을 먼저 위치시키는 것이 좋다.
복합 인덱스를 생성(순서의 중요성을 설명하기위해 1,3,2순의 순서를 정했다.)
CREATE INDEX index_name ON table_name (column1, column3, column2)
SELECT * FROM table_name WHERE column1 = 'value1'
SELECT * FROM table_name WHERE column1 = 'value1' AND column3 = 'value3'
SELECT * FROM table_name WHERE column1 = 'value1' AND column3 = 'value3' AND column2 = 'value2'
SELECT * FROM table_name WHERE column2 = 'value2'
SELECT * FROM table_name WHERE column2 = 'value2' AND column3 = 'value3'
SELECT * FROM table_name WHERE column3 = 'value3' AND column2 = 'value2'
이처럼 where 조건문을 나열할 때 복합 인덱스의 첫 번째 컬럼인 column1 = 'value1'
가 없다면 복합인덱스를 검색할 수 없게 되어 적용되지 않는다.
참고자료(출처)
티스토리 MarrRang Dev Blog 포스팅 DB의 결합 인덱스에 관해서
티스토리 코딩팩토리 블로그 포스팅 [DB] 데이터베이스 결합 인덱스에 대하여
ITSOWAVY 성승훈 블로그 포스팅 복합 인덱스란