클러스터 테이블 vs 논클러스터 테이블 비교

클러스터란?

  • 디스크로부터 데이터를 읽어오는 시간을 줄이기 위해서 자주 사용되는 테이블의 데이터를 디스크의 같은 위치에 저장하는 방법
  • 비슷한 레코드들을 동시에 조회하는 경우가 많아 효율적으로 조회하는 방법으로 고안됨
  • PK가 비슷한 레코드끼리 묶어서 저장하는 것 (MySQL)

 

클러스터 테이블(인덱스)

  • 테이블당 1개씩만 허용됨
  • PK 생성 시 그 컬럼은 자동으로 클러스터 인덱스가 생성됨
    * 일반 인덱스와의 차이
    • 클러스터링 되어 있다는 요소가 추가됨
    • 옵티마이저에서 일반 인덱스보다 높은 랭킹
  • PK를 설정하지 않은 경우는? InnoDB가 다음의 우선순위대로 대체 컬럼을 선택
    • UNIQUE NOT NULL 중 첫번째 인덱스를 클러스터 키로 선택
    • 자동으로 유니크한 값을 가지도록 AUTO_INCREMENT 컬럼을 내부적으로 추가해 클러스터 키로 선택
      * 하지만, 자동으로 추가되는 컬럼은 사용자에게 보이지 않아서 SQL에서 사용할 수가 없음
  • PK에 의해 레코드 저장 위치가 결정됨
    • PK값이 변경되면 -> 레코드의 물리적으로 행을 재배열함 -> 랜덤 액세스가 많이 발생해서 I/O 증가
    • PK를 신중히 결정해야 함
  • 인덱스 페이지의 리프 페이지가 곧 데이터. 즉, 테이블 자체가 인덱스
  • InnoDB 스토리지 엔진에서만 지원함
  • 장점
    • 그룹된 컬럼 데이터 행들이 같은 데이터 블록에 저장되기 때문에 디스크 I/O가 줄어 SELECT 시 처리 성능이 매우 빠름
    • 클러스터된 테이블 사이에 조인이 발생하면 처리 시간이 단축됨
    • INSERT, UPDATE, DELETE 시 항상 정렬 상태를 유지함
    • 이미 정렬된 상태로 저장되기 때문에 인덱스 테이블이 필요하지 않아 논클러스터보다 DB 용량을 덜 차지함
    • 테이블의 모든 보조 인덱스가 PK를 가지고 있기 때문에 인덱스만으로 처리될 수 있는 경우가 많음(커버링 인덱스)
  • 단점
    • 논클러스터보다 검색 속도는 더 빠르지만 INSERT, UPDATE, DELETE는 느림

 

논클러스터 테이블(인덱스)

  • 테이블당 249개 허용됨
  • 레코드의 원본은 정렬되지 않고, 인덱스 테이블만 정렬됨
    • 인덱스 페이지는 로그파일에 저장됨
  • 인덱스 자체의 리프 페이지는 데이터가 아니라 데이터가 위치하는 포인터(RID)이기 때문에 클러스터보다 검색 속도는 느리지만 INSERT, UPDATE, DELETE는 더 빠름

 

비교

  • 쉽게 책에 비유하자면 클러스터 테이블은 페이지를 알기 때문에 바로 그 페이지를 펴는 것(바로 접근)이고, 논클러스터 테이블은 목차에서 찾고자 하는 내용의 페이지를 찾고 그 페이지로 이동하는 것(한번 거쳐서 접근)과 같음

 

참고링크

+ Recent posts