[MySQL] 인덱스구조 : 클러스터링인덱스/넌 클러스터링인덱스
클러스터 : 여러개를 하나로 묶는다는 의미
mysql에서 클러스터링인덱스는 innoDB와 TokuDB 스토리지 엔진에서만 지원
클러스러링 인덱스
테이블의 PK에 대해서만 적용된다. (PK는 클러스터링 인덱스의 기준)
프라이머리 키 값이 비슷한 레코드끼리 묶어서 저장하는 것
PK에 의해 레코드 저장 위치가 결정된다.
PK값이 변경되면 -> 레코드의 물리적인 저장위치가 바뀐다->랜덤액세스가 많이 발생해서 IO증가
그러니까, PK를 신중하게 결정해야한다.
그럼 뭐가 좋은데? PK기반의 검색속도는 빠르다.
넌클러스터링구조와 비교
테이블 구조 자체는 일반 B-트리랑 비슷
B-트리구조의 리프로드에는 파일이 저장되어 있는 주소들이 있음.
그래서 이 주소를 따라 페이지번호로 가면 자식주소까지 찾아가서 데이터를 찾는 방식는
반면, 클러스러팅 구조의 리프노드에는 레코드의 모든 컬럼이 다 저장되어 있다.
테이블의 보조인덱스(Secondary index)가 PK를 가지고 있음
그래서 클러스터링 테이블은 그 자체가 하나의 거대한 인덱스 구조
어떤걸 클러스터드 인덱스로 지정?
1순위. 무조건 PK
2순위. NOT NULL 옵션의 유니크 인덱스중에서 첫번째 인덱스로 지정
3순위. 유니크한 값을 가지도록 증가되는 칼럼(auto_increment) 자동으로 추가해서 지정
*하지만, 자동으로 추가되는 컬럼은 사용자에게 보이지 않아서 SQL에서 사용할 수가 없다.
그래서 결국 PK를 지정하지 않은 경우 = AUTO_INCREMENT를 사용해서 PK로 지정하는 경우
*인조식별자 AUTO_INCREMENT
보조 인덱스도 필요하고, PK 키의 크기도 같으면 AUTO_INCREMENT로 인위적으로 추가하고, 이 컬럼을 PK로 지정
로그 케이블과 같이 조회보다는 INSERT 위주의 테이블은 이렇게 인조식별자로 PK지정하는게 더 좋음
클러스터 인덱스의 장점
PK로 검색 속도가 매우 빠름
커버링인덱스 가능 : 보조인덱스가 PK를 가지고 있기 때문에 인덱스만으로 원하는 데이터를 검색할 수 있음
클러스터 인덱스의 단점
보조인덱스가 PK(클러스터키)를 가지고 있어서 전체적으로 인덱스의 크기가 커짐
보조인덱스로 검색을 할때, PK를 한번더 굳이 검색해야되서 처리성능 느림
INSET할때, PK에 의해 레코드 저장위치가 결정되서 INSERT를 어디에 할지 찾아야 되기 때문에 처리성능 느림
PK를 변경할때, 레코드를 지우고 다시 INSERT해야 되서 처리성능 느림