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에서 테이블에 압축을 사용할 경우, 이 옵션이 활성화 되어야 함
- 이 옵션이 활성화되었든 비활성화되었든 성능의 차이는 거의 없음
댓글 없음:
댓글 쓰기