본문 바로가기

스터디/Real MySql 스터디 (사내)

8장 인덱스 (3)

728x90

클러스터링 인덱스

클러스터링이란 레코드를 비슷한것들끼리 묶어서 저장한다. InnoDB 엔진에서만 지원

PK 에 대해서만 적용됨. PK 는 값에 따라 저장되는 위치가 변경되는데 즉 값이 변경되면 저장되는 위치가 변경된다는 뜻이다

리프 노드에 레코드의 모든 칼럼이 저장돼있다

PK 가 없는 경우 PK 대체 칼럼의 선택 순서

  1. PK 가 있다면 PK 가 클러스터링 키로 선택
  2. PK 가없다면 NOT NULL 옵션의 유니크 인덱스중 첫 번째 인덱스를 클러스터링 키로 선택
  3. 1, 2 조건이 모두 충족되지 않을 경우 자동으로 증가되는 유니크 값을 만들어 클러스터링 키로 선택
    이 경우 사용자는 해당키를 사용할 수 없으므로 꼭 명시적으로 PK 를 만들어주자

 

 

PK 가 세컨더리 인덱스에 미치는 영향

만약 세컨더리 인덱스가 레코드가 저장된 주소를 가지고 있을 경우 클러스터링 키 값이 변경될때마다 해당 테이블의 모든 세컨더리 인덱스에 저장된 주소값을 바꿔주어야 한다

위의 이유로 모든 세컨더리 인덱스는 레코드가 저장된 주소가 아닌 PK 값을 저장하고있다.

 

InnoDB 의 레코드 탐색 순서

  1. 인덱스 탐색을 통해 레코드의 PK 값을 확인
  2. PK 인덱스를 탐색해 최종 레코드 확인

 

클러스터링 인덱스의 장 단점

  • 장점
    • PK 로 검색할경우 매우빠름, 특히 범위 검색시 매우 빠름
    • 테이블의 모든 세컨더리 인덱스가 PK 를 가지고 있기 때문에 커버링 인덱스를 활용할 수 있는 경우가 많음
  • 단점
    • 모든 세컨더리 인덱스가 클러스터링 키를 가지고 있기 때문에 클러스터링 키 값의 크기가 클 경우 전체적인 인덱스의 크기가 커짐
    • 레코드 탐색시 PK 로 탐색하는 절차가 추가되기에 탐색 속도가 느림
    • PK 를 변경할 경우 레코드를 DELETE 하고 INSERT 하는 작업이 필요하기에 처리 속도가 느림

 

PK 값 가이드

  1. AUTO-INCREMENT 보단 업무적인 칼럼으로 생성하자
  2. 반드시 PK 를 명시하자
  3. AUTO-INCREMENT 를 사용할 경우는 INSERT 가 빈번한 테이블에 대해 사용하자

 


유니크 인덱스

유니크함을 제약하는 제약조건이다. NULL 값도 허용함

인덱스 읽기 시엔 일반 인덱스와 비교하여 읽어야할 레코드 건수가 같다면 비슷한 성능이난다.

인덱스 쓰기 시엔 중복이 있는지 확인하는 절차가 추가되기 때문에 일반적인 세컨더리 인덱스를 사용할 때 보다 처리 속도가 느리다. 중복 값을 체크할땐 읽기 잠금을 사용하고 쓰기를 할 땐 쓰기 잠금을 사용하는데 데드락이 아주 빈번하게 발생함. 또한 버퍼를 통해 작업지연을 할 수 없으므로 일반적인 키 보다 변경 작업이 느리다

 

결론적으로 유일성이 꼭 보장되야 할 때만 유니크 인덱스를 사용하자!

 

728x90

'스터디 > Real MySql 스터디 (사내)' 카테고리의 다른 글

8장 인덱스 (2)  (0) 2023.10.29
8장 인덱스 (1)  (0) 2023.10.29