인덱스 키 값의 크기와 성능과 관계
디스크 저장 기본 단위 Page
- InnoDB는 디스크에 데이터 저장하는 가장 기본 단위를 Page or Block
- 디스크의 모든 읽기 쓰기 작업의 최소 작업 단위임
- 또한, 페이지는 InnoDB 엔진의 버퍼 풀에서 데이터를 버퍼링 하는 기본 단위
- 인덱스도 결국 페이지 단위 관리 됨
- 트리의 루트, 브랜치, 리프 노드를 구분한 기준이 바로 페이지 단위
- Page
- 디스크에 저장되는 기본 단위
- 디스크 최소 작업 단위
- InnoDB 엔징 버퍼 풀에 버퍼링 되는 기본 단위
- 인덱스는 페이지 단위로 관리됨
- B-Tree 노드들이 구분 되는 단위가 페이지 단위
B-Tree 노드 개수와 페이지 관계
- 일반적으로 디비의 B-Tree 자식 노드 개수는 가변적
- 그려먼 mysql에서 B-Tree는 자식 노드를 몇개 까지 가질까?
- 이건 바로 인덱스의 페이지 크기와 키 값의 크기에 따라 결정됨
- 5.7 부터 InnoDB 엔진의 페이지 크기를
innodb_page_size 변수를 이용해 4kb ~ 6kb 사이 값 설정 가능하지만 기본값은 16KB(이책에서 16kb로 설명하겠음)
- 인덱스 키가 16바이트라 가정한다면 다음 그림(8.7)같이 인덱스 페이지 가 구성될것
- 자식 노드 주소란 것은 여러 복합적인 정보가 담긴 영역
- 페이지 종류 별로 6~12바이트까지 다양한 크기 가질수 있다
- 여기선 편의상 자식 노드 주소 여역이 평균적으로 12 바이트로 구성된다 가정
- 하나의 인덱스 페이지 16kb에 몇개의 키 저장가능? 계산해보면
- 16x1024/(16+12) = 585
- 585개 자식 노드 가질수있는 B-Tree 되는 것
- 인덱스 키 값 커지면 자식 노드 개수 준다
- 즉, 이러면 디스크 읽는 횟수 늘어나는 경우 생김
- 또한, 인덱스 키 값 늘어난다는건 전체 인덱스 크기 증가의미
- 인덱스 캐시해두는 innodb 버퍼풀이나 MYISAM의 캐시영역은 크기가 제헌적
- 메모리에 캐시해두는 레코드 수 줄어서 메모리 효율 준다