본문 바로가기

CS/데이터베이스

MySQL의 기본 -9

클러스터링 인덱스(Clustered Index) 추가 설명

클러스터링 인덱스는 테이블의 프라이머리 키(Primary Key)를 기준으로 데이터 레코드의 물리적 순서가 정해지는 방식입니다. InnoDB 스토리지 엔진은 모든 테이블에 대해 기본적으로 클러스터링 인덱스를 사용합니다. 이를 통해 데이터의 물리적 저장 순서가 프라이머리 키에 의해 결정되며, 다른 인덱스들은 이를 기반으로 세컨더리 인덱스(Secondary Index)를 생성합니다.

클러스터링 인덱스의 특징

  1. 프라이머리 키 기반 저장
  • 프라이머리 키가 클러스터링 인덱스의 기준이 됩니다.
  • 프라이머리 키 값에 따라 테이블의 레코드가 물리적으로 저장됩니다. 즉, 레코드는 프라이머리 키 순서대로 저장됩니다.
  1. 리프 노드에 모든 데이터 포함
  • B-Tree와 다르게 클러스터링 인덱스의 리프 노드는 실제 테이블 데이터를 포함합니다.
  • 즉, 클러스터링 인덱스의 리프 노드는 단순히 인덱스 키만 저장하는 것이 아니라, 전체 레코드를 포함하므로, 데이터 접근이 더 빠를 수 있습니다.
  1. 프라이머리 키의 변경이 물리적 위치 변경을 초래
  • 프라이머리 키 값이 변경되면 해당 레코드의 물리적 저장 위치도 변경됩니다.
  • 따라서, 프라이머리 키의 선택에 신중해야 하며, 자주 변경되지 않는 불변의 키를 사용하는 것이 좋습니다.

클러스터링 인덱스의 장점

  1. 빠른 조회 성능 (Primary Key 검색)
  • 프라이머리 키 기반으로 레코드가 물리적으로 정렬되기 때문에, 해당 인덱스의 검색 성능이 매우 빠릅니다.
  • 프라이머리 키를 기준으로 레코드가 연속적으로 저장되므로, 범위 검색에 유리합니다.
  1. 디스크 I/O 감소:
  • 리프 노드에 데이터를 포함하므로 데이터와 인덱스가 동일한 구조에 있어 데이터 접근 시 디스크 I/O가 절감됩니다.
  • 범위 검색 시 인덱스와 데이터를 동시에 읽을 수 있어 효율적입니다.
  1. 데이터 삽입 시 최적화
  • 프라이머리 키 순서대로 삽입되므로, 삽입 시에도 데이터가 일정한 순서로 저장되어 삽입 성능이 좋습니다.

클러스터링 인덱스의 단점

  1. 프라이머리 키 변경 비용:
  • 프라이머리 키 값이 변경되면 데이터의 물리적 위치도 변경됩니다. 이때 대량의 I/O 작업이 발생할 수 있습니다.
  • 프라이머리 키를 자주 업데이트하면 성능에 악영향을 미칠 수 있습니다.
  1. 세컨더리 인덱스 크기 증가
  • 클러스터링 인덱스에서는 모든 세컨더리 인덱스가 프라이머리 키 값을 포함해야 합니다.
  • 이로 인해 세컨더리 인덱스 크기가 커지고, 더 많은 디스크 공간을 차지할 수 있습니다.
  • 프라이머리 키의 크기가 커지면, 이 값을 포함하는 모든 세컨더리 인덱스의 크기도 증가합니다.
  1. 테이블 삭제 및 업데이트가 비용이 클 수 있음
  • 클러스터링 인덱스의 특징상 레코드가 물리적으로 순서대로 저장되므로, 삭제 및 업데이트 작업이 빈번하면 서로 다른 페이지 간의 데이터 이동이 발생할 수 있습니다.
  • 빈번한 삭제 및 업데이트로 인해 테이블의 프래그먼트가 발생할 수 있으며, 이로 인해 성능이 저하될 수 있습니다.

클러스터링 인덱스 테이블 사용 시 주의 사항

  1. 프라이머리 키 크기 관리
  • 프라이머리 키가 커지면, 세컨더리 인덱스도 커지므로 성능에 영향을 미칠 수 있다.
  • 일반적으로 Auto-increment 키보다는 업무적인 키를 사용하는 것이 좋습니다.
  • 예를 들어, 업무적인 자연 키(예: 사용자 이메일, 주문 번호 등)를 사용하여 인덱스 크기를 최소화하는 것이 좋습니다.
  1. 프라이머리 키는 반드시 정의해야 한다
  • 프라이머리 키를 정의하지 않으면 InnoDB는 내부적으로 자동으로 프라이머리 키를 생성합니다.
  • 이 때 Auto-increment 필드를 사용하는 경우, 인덱스의 크기가 불필요하게 커질 수 있으므로 가능한 경우 자연 키를 사용하는 것이 좋습니다.
  1. 세컨더리 인덱스에서 프라이머리 키 포함
  • 모든 세컨더리 인덱스는 프라이머리 키를 포함해야 하기 때문에, 프라이머리 키가 길어질수록 세컨더리 인덱스도 커지며 성능이 저하될 수 있다.
  • 작고 간단한 프라이머리 키를 사용하여 세컨더리 인덱스의 크기를 줄이는 것이 중요합니다.
  1. 불필요한 프라이머리 키의 변경을 피해야 한다
  • 프라이머리 키 값의 변경이 데이터의 물리적 위치를 바꾸므로, 불필요한 변경을 피하는 것이 좋습니다.
  • 자주 변경되는 컬럼을 프라이머리 키로 사용하는 것은 피하는 것이 좋습니다.

클러스터링 인덱스 요약

  • 클러스터링 인덱스는 프라이머리 키 기반으로 데이터가 물리적으로 정렬된 인덱스입니다.
  • 프라이머리 키의 선택이 중요하며, 프라이머리 키의 변경은 성능에 큰 영향을 미칩니다.
    리프 노드에 데이터가 포함되어 있어 범위 검색에서 유리하지만, 세컨더리 인덱스의 크기가 커질 수 있습니다.
  • 프라이머리 키 크기와 변경 가능성을 고려하여 인덱스를 설계하는 것이 중요합니다.

'CS > 데이터베이스' 카테고리의 다른 글

MySQL의 기본 -11  (0) 2025.06.02
MySQL의 기본 -10  (0) 2025.06.02
MySQL의 기본 -7  (0) 2025.06.02
MySQL의 기본 -6  (0) 2025.06.02
MySQL의 기본 -5  (0) 2025.06.02