2010년 12월 26일 일요일

InnoDB 데이터 파일 및 테이블스페이스

InnoDB 테이블 스페이스
  • 모든 데이터는 테이블 스페이스 저장됨
  • 테이블 데이터가 옵션 (innodb_file_per_table)에 의해서 하나의 테이블 스페이스에 저장될지,
    테이블별 테이블 스페이스에 저장될지 결정
  • 위의 옵션에 관계없이 시스템 테이블 스페이스는 필요함 (딕셔너리 정보, Undo정보, Merge되지 않은 InsertBuffer, ...)

테이블 스페이스의 구조
  • 테이블 스페이스의 첫번째 페이지는 테이블 스페이스의 메타 정보 포함 (테이블 스페이스 사이즈, 테이블 스페이스 ID)
  • 테이블 스페이스 = 세그먼트의 그룹 (세그먼트는 파일과 비슷한 개념)
  • 세그먼트 = 익스텐트의 그룹 (익스텐트는 일반적으로 64개의 연속된 페이지)
  • 익스텐트 = 페이지의 그룹 (페이지는 16K 블럭)

세그먼트의 종류
  • 테이블은 인덱스의 집합 (InnoDB 테이블은 Clustered index이므로)
  • 각 인덱스는 리프 노드 세그먼트와 Non-리프 노드 세그먼트로 구성됨
    -> 리프 노드와 Non-리프 노드의 세그먼트를 분리함으로써 I/O를 좀더 Sequential I/O로 유도 (성능향상 유도)
  • 특수 세그먼트 포함 (롤백 세그먼트, InsertBuffer, ...)

공간 할당
  • 작은 세그먼트인 경우, 페이지 단위로 할당
  • 큰 세그먼트인 경우, 익스텐트 단위로 할당됨 (프레그멘테이션 방지를 위해서)
  • 페이지는 동일 세그먼트에서 재사용됨
  • 익스텐트의 모든 페이지가 미사용 상태가 되면 동일 테이블 스페이스의 다른 세그먼트에 의해서 재활용됨
  • InnoDB는 절대 테이블 스페이스 사이즈를 줄이지 않음 
  • 시스템 테이블 스페이스는 절대 줄어들지 않음 -> 데이터베이스 전체를 Dump했다가 다시 Loading하면 새로 생성 할 수는 있음
  • innodb_file_per_tale=1 인 경우, truncate table 또는 drop table에 의해서 테이블 스페이스가 시스템에 반납됨

innodb_file_per_table = 1
  • 일반적으로 데이터 파일의 사이즈가 작으면 조작이 간편 (OS 명령 이용시)
  • 테이블이 삭제되거나 Truncate될때, 테이블 스페이스 공간이 OS로 반납됨 (공용 테이블 스페이스를 사용할 경우 OS에 반납 안됨)
  • ALTER TABLE ${TABLE_NAME} ENGINE=INNODB; 명령으로 테이블 스페이스를 데이터 사이즈에 맞게 줄일 수 있음(프레그멘테이션도 제거)
  • InnoDB Plugin에서 테이블에 압축을 사용할 경우, 이 옵션이 활성화 되어야 함
  • 이 옵션이 활성화되었든 비활성화되었든 성능의 차이는 거의 없음

댓글 없음:

댓글 쓰기