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