중복된 값이 있는 열에 인덱싱하는 방법
📊 중복 값이 있는 열의 인덱스 관리 전략¶
1. 인덱스 선택도 (Index Selectivity)¶
인덱스를 생성할 때 가장 먼저 고려해야 할 개념입니다. 인덱스가 얼마나 데이터를 잘 걸러내는지(필터링)를 의미합니다.
- 낮은 선택도 (Low Selectivity): 성별(남/여)처럼 데이터 종류는 적은데 중복이 매우 많은 경우입니다. 1억 건의 데이터 중 절반이 '남성'이라면, 인덱스를 타더라도 여전히 5천만 건을 뒤져야 하므로 인덱스 효율이 거의 없습니다(Useless).
- 높은 선택도 (High Selectivity): 주민등록번호나 이메일처럼 중복이 거의 없는 경우입니다. 인덱스가 단 몇 개의 행으로 바로 안내하므로 매우 효율적입니다.
- 실무 팁: 중복이 많아 선택도가 낮은 열은 단독 인덱스보다는 결합 인덱스(Composite Index)로 구성하여 필터링 능력을 높이는 것이 좋습니다.
2. 중복 키 값의 물리적 저장 방식¶
비고유 인덱스에서 동일한 키 값(예: Code: 0)이 여러 번 등장할 때, 데이터베이스는 이를 어떻게 저장할까요?
A. 전통적인 방식 (Naive Implementation)¶
가장 단순한 구현으로, 중복된 키마다 포인터를 각각 저장합니다.
- 구조:
[Key: 0, RowID: 1],[Key: 0, RowID: 2],[Key: 0, RowID: 3]... - 단점: 키 값(
0)이 계속 반복 저장되므로 인덱스 크기가 불필요하게 커지는(Bloat) 현상이 발생합니다.
B. 중복 제거 방식 (Index Deduplication)¶
최신 데이터베이스(예: PostgreSQL 13 이상)에서 채택하는 최적화 기법입니다.
- 구조:
[Key: 0] -> [RowID: 1, 2, 3, 4, 5] - 동작: 키 값은 한 번만 기록하고, 해당 키에 속한 행의 위치(Pointer/RowID) 목록을 배열 형태로 관리합니다.
- 장점: 저장 공간을 획기적으로 줄이고, 동일 키를 찾을 때 디스크 I/O를 감소시킵니다.
3. 실무적인 접근 태도 (Expert Mindset)¶
강의에서 강조한 "전문가로 성장하는 방법"에 대한 조언입니다.
- 구현에 정답은 없다: MySQL이나 PostgreSQL이 특정 방식을 쓴다고 해서 그것만이 유일한 정답은 아닙니다. 각 엔진은 상황에 맞는 최적의 효율을 위해 서로 다른 메커니즘을 선택합니다.
- 직접 측정하라: 이론도 중요하지만, 자신의 데이터 세트에서 인덱스가 효과가 있는지 실행 계획(Execution Plan)을 반드시 확인해야 합니다.
- 질문이 곧 성장이다: "내부적으로 어떻게 돌아갈까?"를 고민하기 시작하는 순간이 바로 초보자에서 전문가로 넘어가는 지점입니다.
💡 요약 및 결론¶
"중복이 너무 많은 열에 인덱스를 만드는 것은 무의미할 수 있다. 하지만 꼭 필요하다면 최신 DB의 중복 제거(Deduplication) 기능을 활용하거나, 다른 열과 조합하여 선택도를 높여야 한다."