오늘 뭐했냐/개발에 대한 주저리
23.09.19 복합 인덱스(Composite Index, Compound Index)
스스로에게
2023. 9. 20. 02:52
복합 인덱스
데이터베이스 테이블에서 두 개 이상의 컬럼을 합쳐서 하나의 인덱스로 생성한 것이다. 이러한 인덱스는 여러 컬럼의 조합에 대한 쿼리 성능을 개선하는 데 유용하다.
복합 인덱스의 특징:
- 순서 중요: 복합 인덱스에서 컬럼의 순서는 매우 중요하다. index(first_name, last_name)은 first_name 후에 last_name 순으로 데이터를 정렬 한다. 따라서 first_name에 대한 검색은 빠르지만, last_name만을 사용하여 검색하면 인덱스가 사용되지 않을 수 있다.
- 효율적인 검색: 복합 인덱스는 해당 컬럼들의 조합에 대한 검색이나 정렬에서 효율적이다.
- 데이터베이스 공간: 인덱스는 추가적인 저장 공간을 사용하므로, 불필요한 복합 인덱스는 피하는 것이 좋다.
복합 인덱스 사용 시 주의사항:
- 쿼리 계획: 복합 인덱스가 쿼리 성능 향상에 기여하는지 확인하기 위해서는 쿼리 계획을 확인하는 것이 좋다. DBMS의 쿼리 최적화기는 여러 가능한 인덱스 중에서 최적의 인덱스를 선택하려고 시도한다.
- 인덱스 선택성: 인덱스의 선택성이 높을수록 좋다. 이것은 유니크한 값이 많은 컬럼을 인덱스의 앞부분에 위치시키는 것이 유리할 수 있다는 것이다.
- 유지 비용: 데이터의 삽입, 수정, 삭제 시에 인덱스 역시 갱신되어야 한다. 따라서 인덱스는 검색 성능을 향상시키지만, 데이터 변경 작업의 비용을 증가시킬 수 있다.
어떤 컬럼을 복합 인덱스로 사용해야할까?
- where절에서 and 조건으로 자주 결합되어 사용되면서 각각의 분포도 보다 두 개 이상의 컬럼이 결합될 때 분포도가 좋아지는 컬럼들
- 다른 테이블과 조인의 연결고리로 자주 사용되는 컬럼들
- order by에서 자주 사용되는 컬럼들
- 하나 이상의 키 컬럼 조건으로 같은 테이블의 컬럼들이 자주 조회될 때
복합 인덱스를 구성할 때 컬럼의 순서는 어떻게 해야할까?
복합 인덱스를 사용하는 쿼리는 인덱스의 첫 번째 컬럼부터 순차적으로 적용되며, 해당 컬럼에 대한 정렬을 수행한다. 따라서 컬럼의 순서는 매우 중요고, 컬럼의 순서는 *카디널리티(cardinality)가 높은 것부터 낮은 순으로 나열하는 것이 좋다.
*카디널리티(cardinality) : 특정 데이터 집합의 유니크한 값의 개수를 뜻 한다.
데이터의 중복도가 낮으면, 카디널리티가 높다고 표현하고, 반대로 데이터 중복도가 높으면, 카디널리티가 낮은 것이다.
- 카디널리티가 낮은 컬럼 (데이터 중복도가 높은 컬럼)
- 카디널리티가 높은 컬럼 (데이터 중복도가 낮은 컬럼)
예시
어떤 테이블에 name 컬럼과 age 컬럼이 있다면, name 컬럼이 age 컬럼에 비해 카디널리티가 높다. 같은 나이인 사람은 많지만, 이름이 같은 사람은 상대적으로 적기 때문이다. 따라서, name 컬럼과 age 컬럼을 활용하여 복합 인덱스를 생성하려면, name, age 순으로 하는 게 좋다.
이것도 당장 내가 복합 인덱스를 만들어서 사용할만큼 규모가 크거나 많은 데이터를 다루지 않는다. 하지만 이런 게 있다는 것을 알고 있어야지 장단점이 뭔지 알고 적용할지 말지 판단을 하지. 블로그는 내 개인 사전이다.