DB 인덱스의 장단점

2024. 5. 10. 22:04코딩/잡 공부

 

DB 인덱스의 장단점

데이터베이스 인덱스는 데이터 검색 속도를 향상시키기 위해 사용되는 구조입니다. 인덱스를 사용하면 특정 컬럼의 값에 기반하여 데이터를 빠르게 찾을 수 있습니다. 하지만 인덱스 사용에는 장점과 단점이 모두 존재합니다.

 

 

 

인덱스의 장점

  1. 검색 성능 향상: 인덱스를 사용하면 테이블 전체를 스캔하는 대신 인덱스를 통해 빠르게 데이터를 찾을 수 있습니다. 특히 큰 데이터 세트에서 이점이 큽니다.
  2. 정렬된 데이터 접근: 인덱스는 데이터를 정렬된 상태로 유지하므로, 범위 검색과 정렬 작업이 훨씬 빠르고 효율적입니다.
  3. 조인 성능 향상: 두 테이블을 조인할 때 인덱스가 있으면 조인 연산의 효율이 증가합니다. 인덱스는 관련 행을 빠르게 찾아 성능을 개선합니다.

인덱스의 단점

  1. 공간 사용: 인덱스는 추가적인 디스크 공간을 사용합니다. 인덱스 크기는 해당 컬럼의 데이터 유형과 테이블의 크기에 따라 달라질 수 있습니다.
  2. 유지 관리 비용: 데이터가 삽입, 삭제, 업데이트될 때마다 인덱스도 업데이트되어야 합니다. 이 과정에서 성능 저하가 발생할 수 있으며, 특히 쓰기가 많은 환경에서는 인덱스가 부담이 될 수 있습니다.
  3. 최적화의 복잡성: 적절한 인덱스를 설계하고 유지하는 것은 복잡할 수 있습니다. 잘못된 인덱스는 성능을 저하시킬 수 있으므로, 사용하는 쿼리와 데이터 패턴에 맞게 인덱스를 신중하게 선택하고 조정해야 합니다.

 

 

 

 

 

나쁜 인덱스 예시

 

예 1: 저 선택도(낮은 카디널리티) 컬럼에 인덱스 설정

고객의 도시(City)는 한정된 수의 도시 이름을 가지고 있으므로 선택도가 낮습니다. 이 컬럼에 인덱스를 설정하는 것은 일반적으로 좋지 않습니다.

 

 

예 2: 모든 컬럼에 인덱스 설정

모든 컬럼에 인덱스를 설정하는 것은 일반적으로 매우 비효율적입니다.

 

 

 

 

 

데이터가 자주 변경되는 환경에서 인덱스 사용은 신중

 

인덱스의 적절한 사용

인덱스는 선택도가 높고 자주 사용되는 쿼리의 컬럼에 적용하는 것이 좋습니다. 또한 데이터의 변경 빈도, 쿼리 패턴, 읽기 대 쓰기 비율 등을 고려하여 인덱스를 계획해야 합니다.

 

인덱스와 데이터 변경의 영향

  1. 성능 저하: 데이터가 변경될 때마다 관련 인덱스도 업데이트해야 합니다. 이는 데이터 삽입, 삭제, 업데이트 시 추가적인 연산을 요구하므로 성능 저하를 초래할 수 있습니다. 특히, 인덱스가 많거나 인덱스가 크고 복잡할 경우 이러한 영향이 더욱 커집니다.
  2. 유지 관리 비용: 인덱스를 유지 관리하기 위해서는 추가적인 저장 공간이 필요하고, 백그라운드에서 인덱스를 최신 상태로 유지하기 위한 작업이 필요합니다. 이는 시스템 리소스를 추가로 소모합니다.
  3. 트랜잭션 지연: 데이터베이스에서 트랜잭션이 실행될 때, 인덱스의 업데이트로 인해 트랜잭션 완료 시간이 늘어날 수 있습니다. 이는 특히 고부하 상황에서 더욱 문제가 될 수 있습니다.

 

 

 

 

인덱스 전략

데이터가 자주 변경되는 환경에서는 다음과 같은 인덱스 전략을 고려할 수 있습니다.

  • 필요한 인덱스만 생성: 가장 중요하고 검색 빈도가 높은 컬럼에 대해서만 인덱스를 생성하여, 오버헤드를 최소화합니다.
  • 인덱스 유형 선택: 데이터 변경 패턴에 맞는 인덱스 유형을 선택합니다. 예를 들어, B-트리 인덱스는 범용적으로 사용되지만, 업데이트 비용이 높을 수 있으므로, 해시 인덱스와 같이 변경에 덜 민감한 인덱스를 고려할 수 있습니다.
  • 배치 처리: 가능하다면 데이터 변경 작업을 배치로 처리하여, 인덱스 업데이트를 한 번에 수행하고 효율을 높일 수 있습니다.

 

 

삭제 작업 오버헤드

 

인덱스 유형에 따라 오버헤드가 달라질 수 있습니다. 예를 들어:

  1. B-트리 인덱스의 경우, 삭제 작업은 인덱스에서 특정 노드를 찾고, 그 노드에서 해당 키를 제거하는 것을 포함합니다. 이 과정에서 트리의 균형을 유지하기 위해 노드 병합이나 재분배가 필요할 수도 있습니다.
  2. 해시 인덱스에서는 삭제된 키의 해시 버킷에서 해당 키와 포인터를 간단히 제거할 수 있습니다. 해시 인덱스는 주로 등가 조건의 조회에 최적화되어 있어, 트리 구조의 인덱스보다는 복잡한 조정이 덜 필요합니다.
  3. 풀 텍스트 인덱스와 같은 다른 유형의 인덱스에서도 비슷한 프로세스가 적용될 수 있으며, 인덱스 구조에 따라 오버헤드가 달라집니다.

 

mysql의 디폴트 인덱스는 B-트리