Open DaehunGwak opened 2 years ago
Page(block)
라는 단위로 레코드를 저장하며, 크기는 16KB(default)로 고정된 크기를 가짐
레코드의 인덱스 기준으로 정렬함
InnoDB의 레코드는 클러스터링
되어 기본 키
로 정렬됨(default)
재활용
하기 때문인덱스 키의 크기와 한 페이지에 저장할 수 있는 키의 갯수는 반비례한다.
기수성
은 즉, 인덱스 컬럼의 값 중 유니크 한 값의 수
인덱스 레인지 스캔
이란, 검색을 통한 인덱스 범위가 정해져 있을 때 리프 노드 레코드를 찾으려는 인덱스 값의 시작부터 차례대로 읽는 것 ↔ 인덱스 풀 스캔
그 뒤에 스캔된 레코드를을 하나씩
데이터 파일로부터 랜덤 I/O를 통해 읽어온다.
인덱스 탐색
인덱스 스캔
인덱스 키 그리고 레코드 주소로 페이지를 가져와서 레코드를 읽음
인덱스 풀 스캔
의 경우 인덱스만 읽는 방식(인덱스에 명시된 컬럼만으로 조건을 처리할 수 있음)
쿼리를 충족하는데 필요한 모든 데이터를 갖춘 인덱스를 커버링 인덱스
라고 함
인덱스 풀 스캔, 인덱스 레인지 스캔 등은 타이트(tight) 인덱스 스캔
↔ 루스(loose) 인덱스 스캔
필요한 리프 노드만 스캔하는 방식의 루스 인덱스 스캔(인덱스 스킵 스캔)
인덱스 스캔 방향은 옵티마이저에 의해서 실시간으로 만들어지는 실행 계획에 의해 결정됨
인덱스의 정렬은 정렬 순서를 컬럼에 따라 혼합(오름/내림차순) 가능
인덱스는 생성 시점에서 정렬되지만, 쿼리로 인덱스를 사용하는 시점에서 읽는 방향에 따라 정렬 효과를 얻음
최소화
할 수 있음복합 인덱스로 혼합 정렬을 하는 경우에는 내림차순 인덱스
로만 해결될 수 있다.
그래서 B-Tree 인덱스를 사용하려면..
InnoDB엔진에서 비슷한 값들을 동시에 조회
한다는 점에서 착안한 프라이머리 키
에만 적용되는 저장 방식
기본 키로 검색하면 매우 빠름
커버링 인덱스가 되는 경우가 많음
단, 클러스터링 키 값이 커지면 전체적인 인덱스 크기가 커짐
레코드의 모든 컬럼이 리프 노드에 저장되어 있음
기본 키가 없는 테이블의 경우 다음 우선순위대로 대체 컬럼을 선택함
InnoDB 테이블의 모든 세컨더리 인덱스는 기본 키 값을 저장하도록 구현됌
자동 증가 값을 기본 키로 설정하고, 상대적으로 긴 인덱스를 세컨더리 인덱스로 둠으로써 성능 향상을 도모할 수 있음
인위적인 기본 키(Surrogate Key)
클러스터링 키 역할은 못함
읽기 및 쓰기 성능 관점에서 세컨더리 인덱스(유니크 하지 않음)는 큰 차이가 없음
서로 역할은 같음
중복 검사에 대한 비용이 있음
체인지 버퍼
를 사용해 빠르지만, 유니크 검사에는 영향이 적음
유니크 인덱스는 반드시 성능 향상을 가져오지는 않음
https://dev.mysql.com/doc/internals/en/innodb-page-structure.html
삽입이 비쌈(Split때문)
키값의 바이트 사이즈는 작을수록 좋다.
키값의 바이트 사이즈는 유니크한 칼럼의 갯수(기수성)에 맞춰서 최저한으로 해두는게 좋겠다.
PK를 기준으로 비슷한 것들을 묶어 정렬
PK를 변경하면 레코드의 물리적 저장 위치도 바뀌어야 한다. (DELETE 후 INSERT하는 동작)
따라서 레코드 ID에 커플링되는 무언가가 없도록 세컨더리 인덱스는 해당되는 PK가 무엇인지로 이어진다.
레코드를 조회할 수 있는 레코드 ID는 항상 PK에 의해 접근되도록 되어 있다.
PK 자체에 대한 의존도가 높아서 잘 정해야 한다.
PK가 없는 경우에 클러스터링은 어떻게 하나
PK가 없으면 NOT NULL인 유니크 인덱스 중 첫번째 인덱스를 클러스터링 키로 고른다.
그것도 없으면 유니크한 값을 가지는 칼럼을 자동 생성한 뒤 클러스터링 키로 쓴다.
명시적으로 조회가 불가능하며 의미도 없는 값이므로 사실상 활용할 수 없음.
유니크하지 않은 세컨더리 인덱스와 구조적 차이는 없다.
세컨더리 인덱스보다 편집이 느리다. 바꿀 때 마다 유니크한지에 대한 검증이 필요하기 때문
세컨더리 인덱스의 퍼포먼스가 유니크 인덱스에 비해 퍼포먼스가 부족한 건 겹치는 값이 적어서 비교할 레코드가 많기 때문이다.
진도
8.3 B-Tree 인덱스 8.8 클러스터링 인덱스 8.9 유니크 인덱스
일정