Loading...
MySQL 9.5 Reference Manual 9.5의 17.11.2 File Space Management의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
구성 파일에서
innodb_data_file_path
구성 옵션을 사용하여 정의하는 데이터 파일들은 InnoDB 시스템 테이블스페이스를 구성합니다.
이 파일들은 논리적으로 연결되어 시스템 테이블스페이스를 형성합니다.
스트라이핑은 사용되지 않습니다.
시스템 테이블스페이스 내에서 테이블이 어디에 할당될지 사용자가 정의할 수는 없습니다.
새로 생성된 시스템 테이블스페이스에서 InnoDB는 첫 번째 데이터 파일부터 공간을 할당하기 시작합니다.
모든 테이블과 인덱스를 시스템 테이블스페이스 내부에 저장할 때 발생하는 문제를 피하기 위해,
각각 새로 생성되는 테이블을 별도의 테이블스페이스 파일(확장자 .ibd)에 저장하는
innodb_file_per_table
구성 옵션(기본값)을 활성화할 수 있습니다.
이 방식으로 저장되는 테이블의 경우, 디스크 파일 내부의 단편화가 줄어들고,
테이블을 truncate할 때 공간은 시스템 테이블스페이스 내부에서 InnoDB에 의해 계속 예약된 상태로 남는 대신
운영 체제에 반환됩니다.
자세한 내용은
Section 17.6.3.2, “File-Per-Table Tablespaces”를 참조하십시오.
또한 테이블을
general tablespaces에 저장할 수도 있습니다.
제너럴 테이블스페이스는 CREATE TABLESPACE
구문을 사용하여 생성하는 공유 테이블스페이스입니다.
MySQL 데이터 디렉터리 외부에 생성할 수 있으며,
여러 테이블을 담을 수 있고, 모든 로우 포맷의 테이블을 지원합니다.
자세한 내용은
Section 17.6.3.3, “General Tablespaces”를 참조하십시오.
각 테이블스페이스는 데이터베이스
페이지로 구성됩니다.
하나의 MySQL 인스턴스 내의 모든 테이블스페이스는 동일한 페이지 크기를 가집니다.
기본적으로, 모든 테이블스페이스는 16KB 페이지 크기를 사용합니다.
MySQL 인스턴스를 생성할 때
innodb_page_size 옵션을 지정하여
페이지 크기를 8KB 또는 4KB로 줄일 수 있습니다.
또한 페이지 크기를 32KB 또는 64KB로 늘릴 수도 있습니다.
자세한 내용은
innodb_page_size 문서를 참조하십시오.
페이지들은 크기가 1MB인
익스텐트로 그룹화됩니다(최대 16KB 크기의 페이지에 대해,
연속된 16KB 페이지 64개, 또는 8KB 페이지 128개, 또는 4KB 페이지 256개).
페이지 크기가 32KB인 경우, 익스텐트 크기는 2MB입니다.
페이지 크기가 64KB인 경우, 익스텐트 크기는 4MB입니다.
테이블스페이스 내부의 “파일”들은 InnoDB에서
세그먼트라고 부릅니다.
(이 세그먼트는 실제로 많은 테이블스페이스 세그먼트를 포함하는
롤백 세그먼트와는 다릅니다.)
세그먼트가 테이블스페이스 내에서 성장할 때,
InnoDB는 처음 32개의 페이지를 한 번에 하나씩 할당합니다.
그 이후에는 InnoDB가 세그먼트에 전체 익스텐트를 할당하기 시작합니다.
InnoDB는 데이터의 좋은 순차성을 보장하기 위해
큰 세그먼트에 한 번에 최대 4개의 익스텐트를 추가할 수 있습니다.
InnoDB에서는 각 인덱스마다 두 개의 세그먼트가 할당됩니다.
하나는 B-tree의 nonleaf 노드용이며,
다른 하나는 leaf 노드용입니다.
leaf 노드를 디스크 상에서 연속적으로 유지하면, 이 leaf 노드에 실제 테이블 데이터가 포함되어 있으므로,
더 나은 순차 I/O 연산을 수행할 수 있습니다.
테이블스페이스의 일부 페이지에는 다른 페이지들의 비트맵이 포함되어 있으므로,
InnoDB 테이블스페이스의 일부 익스텐트는 전체를 세그먼트에 할당할 수 없고,
개별 페이지 단위로만 할당될 수 있습니다.
SHOW TABLE STATUS
문을 실행하여 테이블스페이스에서 사용 가능한 빈 공간을 요청하면,
InnoDB는 테이블스페이스에서 확실히 비어 있는 익스텐트를 보고합니다.
InnoDB는 항상 정리 및 기타 내부 목적을 위해 일부 익스텐트를 예약해 두며,
이러한 예약된 익스텐트는 빈 공간에 포함되지 않습니다.
테이블에서 데이터를 삭제하면, InnoDB는 해당 B-tree 인덱스를 축소합니다.
해제된 공간이 다른 사용자가 사용할 수 있게 되는지 여부는
삭제 패턴이 테이블스페이스에 개별 페이지를 해제하는지 아니면 익스텐트를 해제하는지에 따라 달라집니다.
테이블을 drop하거나 모든 로우를 삭제하면 공간이 다른 사용자에게 확실히 반환되지만, 삭제된 로우는 트랜잭션 롤백 또는 일관 읽기에 더 이상 필요하지 않게 된 후 일정 시간이 지난 뒤 자동으로 수행되는 purge 연산에 의해서만 실제로 제거된다는 점을 기억해야 합니다. (자세한 내용은 Section 17.3, “InnoDB Multi-Versioning”을 참조하십시오.)
innodb_segment_reserve_factor
변수는 테이블스페이스 파일 세그먼트 페이지 중 빈 페이지로 예약할 비율을 정의할 수 있게 해줍니다.
향후 성장을 위해 일정 비율의 페이지를 예약하여
B-tree의 페이지가 연속적으로 할당될 수 있도록 합니다.
예약 페이지의 비율을 수정하는 기능을 통해
데이터 단편화 문제나 저장 공간 비효율성 문제를 해결하도록
InnoDB를 미세 조정할 수 있습니다.
이 설정은 file-per-table 및 제너럴 테이블스페이스에 적용됩니다.
innodb_segment_reserve_factor
기본 설정값은 12.5 percent입니다.
innodb_segment_reserve_factor
변수는 동적이며,
SET 문을 사용하여 설정할 수 있습니다.
예를 들면 다음과 같습니다:
1mysql> SET GLOBAL innodb_segment_reserve_factor=10;
4KB, 8KB, 16KB, 32KB
innodb_page_size 설정에 대해,
최대 로우 길이는 데이터베이스 페이지 크기의 절반보다 약간 작습니다.
예를 들어, 기본 16KB InnoDB 페이지 크기의 경우,
최대 로우 길이는 8KB보다 약간 작습니다.
64KB innodb_page_size
설정의 경우, 최대 로우 길이는 16KB보다 약간 작습니다.
로우가 최대 로우 길이를 초과하지 않으면, 로우 전체가 페이지 내에 로컬하게 저장됩니다. 로우가 최대 로우 길이를 초과하면, 로우가 최대 로우 길이 제한 내에 들어갈 때까지 가변 길이 컬럼이 외부 오프 페이지 저장 대상으로 선택됩니다. 가변 길이 컬럼의 외부 오프 페이지 저장 방식은 로우 포맷에 따라 다릅니다:
COMPACT 및 REDUNDANT Row Format
가변 길이 컬럼이 외부 오프 페이지 저장 대상으로 선택되면,
InnoDB는 해당 컬럼의 처음 768바이트를 로우 내에 로컬하게 저장하고,
나머지는 오버플로 페이지에 외부적으로 저장합니다.
각 컬럼은 고유한 오버플로 페이지 리스트를 갖습니다.
768바이트 프리픽스에는 컬럼의 실제 길이를 저장하고
나머지 값이 저장된 오버플로 리스트를 가리키는 20바이트 값이 함께 저장됩니다.
Section 17.10, “InnoDB Row Formats”를 참조하십시오.
DYNAMIC 및 COMPRESSED Row Format
가변 길이 컬럼이 외부 오프 페이지 저장 대상으로 선택되면,
InnoDB는 로우 내에 20바이트 포인터를 로컬하게 저장하고,
나머지는 오버플로 페이지에 외부적으로 저장합니다.
Section 17.10, “InnoDB Row Formats”를 참조하십시오.
LONGBLOB 및
LONGTEXT 컬럼은
4GB 미만이어야 하며,
BLOB 및
TEXT 컬럼을 포함한
전체 로우 길이는 4GB 미만이어야 합니다.
17.11.1 InnoDB Disk I/O
17.11.3 InnoDB Checkpoints