인덱스 키 값의 크기와 성능과 관계

디스크 저장 기본 단위 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의 캐시영역은 크기가 제헌적
  • 메모리에 캐시해두는 레코드 수 줄어서 메모리 효율 준다