1. 인덱스 설계 가이드라인
- 인덱스를 만드는 법(
CREATE INDEX)을 아는 것보다 더 중요한 것은, 어디에 인덱스를 만들어야 하는지 아는 것입니다. - 잘못된 인덱스는 오히려 시스템 성능을 떨어뜨리는 애물단지가 될 수 있습니다.
- 인덱스는 결코 공짜가 아닙니다. 데이터를 추가(
INSERT), 수정(UPDATE), 삭제(DELETE)할 때마다 인덱스도 함께 변경되어야 하므로 쓰기 성능이 저하되고, 별도의 저장 공간도 차지합니다. - 따라서 우리는 이 비용을 상쇄하고도 남을 만큼의 '검색 성능 향상'이라는 이득을 얻을 수 있는 곳에만 전략적으로 인덱스를 생성해야 합니다.
기본 개념 참고
인덱스에 대한 기본적인 내용은 Index 문서, 옵티마이저와 커버링 인덱스는 Optimizer 문서, 복합 인덱스는 Composite Index 문서를 참고해주세요.
2. 핵심 원칙: 카디널리티 (Cardinality)
- 인덱스를 어디에 걸지 판단하는 가장 중요한 기준은 바로 **카디널리티(Cardinality)**입니다.
- 카디널리티란, 해당 컬럼에 저장된 값들의 고유성(uniqueness) 정도를 나타내는 지표입니다.
2.1 카디널리티가 높다 (High Cardinality)
- 해당 컬럼에 중복되는 값이 거의 없다는 의미입니다.
- 예:
items테이블의item_id,item_name
2.2 카디널리티가 낮다 (Low Cardinality)
- 해당 컬럼의 값이 몇 종류 안되어 중복되는 값이 많다는 의미입니다.
- 예:
items테이블의category(5종류),is_active(2종류)
2.3 왜 카디널리티가 중요한가?
- 인덱스는 '찾아보기'입니다. 찾아보기가 효과적이려면, 특정 키워드를 찾았을 때 검색 범위가 확 줄어들어야 합니다.
items테이블에서WHERE is_active = TRUE라는 조건으로 검색한다고 생각해 보겠습니다.is_active컬럼에 인덱스가 있더라도,TRUE인 데이터가 전체의 80%라면, 데이터베이스는 인덱스를 통해 전체 데이터의 80%를 스캔해야 합니다.- 이런 경우 데이터베이스 옵티마이저는 "이럴 바엔 그냥 풀 테이블 스캔하는 게 낫겠다"고 판단할 수 있습니다.
- 반면
WHERE item_name = '게이밍 노트북'은 어떤가요? - 인덱스는 수십만 건의 상품 데이터 중 단 1건으로 검색 범위를 완벽하게 좁혀줍니다.
- 더 자세한 내용은 아래 문서를 참고해주세요.
인덱스 설계의 핵심 규칙
인덱스는 카디널리티가 높은, 즉 식별력이 좋은 컬럼에 생성할 때 가장 효율적입니다.
3. 인덱스 생성 가이드라인
- 위의 핵심 원칙을 바탕으로, 어떤 컬럼이 인덱스 후보가 되는지 구체적인 가이드라인을 살펴보겠습니다.
3.1 WHERE 절에서 자주 사용되는 컬럼
- 가장 기본적이고 명백한 가이드라인입니다.
- 인덱스의 존재 이유 자체가
WHERE절의 검색 속도를 높이는 것이기 때문입니다. - 사용자들이 상품을 검색할 때
items.item_name으로 검색하거나, 특정 카테고리(items.category)를 필터링한다면 이 컬럼들은 인덱스 생성의 우선 후보가 됩니다.