14.10.2 파일 공간 관리
구성 파일에서 정의하는 데이터 파일은 InnoDB
시스템 테이블 스페이스 가 형성됩니다. 이러한 파일은 테이블 공간을 형성하기 위해 논리적으로 연결됩니다. 스트라이핑은 사용되지 않습니다. 현재 테이블 스페이스 내의 어디에 테이블이 분할하는 방법을 정의 할 수 없습니다. 새로 만들어진 테이블 공간은 InnoDB
는 첫 번째 데이터 파일에서 영역을 할당합니다.
시스템 테이블 공간의 내부에 모든 테이블 및 인덱스를 저장하여 발생하는 문제를 해결하기 위해 innodb_file_per_table
구성 옵션을 선택 할 수 있습니다. 이 옵션은 새로 작성된 각 테이블을 별도의 테이블 공간 파일에 (확장자 .ibd
에서) 저장합니다. 이 방법으로 저장된 테이블의 경우 디스크 파일 조각화는 감소하고 테이블이 절단되면, 그 영역은 InnoDB에 의해 계속 시스템 테이블 스페이스에 예약되는 것이 아니라 운영 체제에 반환됩니다 .
페이지, 익스텐트, 세그먼트 및 테이블 공간
각 테이블 스페이스는 데이터베이스 페이지 로 구성되어 있습니다. MySQL 인스턴스의 테이블 스페이스는 동일한 페이지 크기 를 가지고 있습니다. 기본적으로 모든 테이블 스페이스가 16K 바이트의 페이지 크기를 가지고 있습니다. 이 페이지 크기를 8K 바이트 또는 4K 바이트 줄이기 위해 MySQL 인스턴스를 만들 때 innodb_page_size
옵션을 지정합니다.
이 페이지는 크기 1M 바이트의 범위 (연속 된 64 개의 16K 바이트 페이지 128 개의 8K 바이트 페이지 또는 256 개의 4K 바이트 페이지)에 그룹화됩니다. InnoDB
는 테이블 스페이스 내부의 "파일"을 세그먼트 라고합니다. (이러한 세그먼트는 실제로 다수의 테이블 스페이스 세그먼트가 포함되어있는 롤백 세그먼트 는 다릅니다.)
세그먼트가 테이블 스페이스 내부에서 확장되는 경우, InnoDB
는 그 세그먼트에 처음 32 페이지를 한 번에 할당합니다. 그 후, InnoDB
는 그 세그먼트에 대한 모든 익스텐트 할당을 시작합니다. InnoDB
는 데이터의 좋은 연속성을 보장하기 위해 큰 세그먼트는 1 번에 최대 4 개의 익스텐트를 추가 할 수 있습니다.
InnoDB
는 각 인덱스에 2 개의 세그먼트가 할당됩니다. 하나는 B 트리의 리프가 아닌 노드 용이고 다른 하나는 리프 노드입니다. 리프 노드를 디스크에서 연속적인 상태로 유지하면 이러한 리프 노드는 실제 테이블 데이터가 포함되어 있기 때문에 순차 I / O 작업의 성능이 향상됩니다.
테이블 공간의 일부 페이지는 다른 페이지의 비트 맵이 포함되어 있기 때문에 InnoDB
테이블 스페이스 내의 일부 범위는 전체가 아닌 개별 페이지로만 세그먼트에 할당 할 수 있습니다 .
SHOW TABLE STATUS
명령문을 실행하여 테이블 공간에서 사용 가능한 공간을 구하면, InnoDB
는 테이블 스페이스 내의 확실히 빈 익스텐트를보고합니다. InnoDB
는 항상 어떤 범위를 정리 및 기타 내부 목적을 위해 예약합니다. 이 예약 된 범위는 공간에 포함되지 않습니다.
테이블에서 데이터를 삭제하면 InnoDB
는 해당 B 트리 인덱스를 짧게합니다. 해방 된 영역을 다른 사용자가 사용할 수있게 될지 어떨지는 삭제 패턴 테이블 스페이스에 대해 개별 페이지 또는 범위 중을 해제할지에 따라 다릅니다. 테이블을 삭제하거나 테이블의 모든 행을 삭제하거나하면 그 영역은 확실히 다른 사용자에게 공개되지만, 그 삭제 된 행은 그 행이 트랜잭션 롤백 또는 일관성 읽기 필요 없어진 뒤, 잠시 후 자동으로 발생하는 퍼지 조작에 의해서만 물리적으로 제거되는 점에 유의하십시오. ( 섹션 14.2.12 "InnoDB 멀티 버전" 을 참조하십시오.)
테이블 공간에 대한 정보를 표시하려면 테이블 스페이스 모니터를 사용합니다. 섹션 14.15 "InnoDB 모니터" 를 참조하십시오.
페이지 테이블 행에 연결
가변 길이 컬럼 ( VARBINARY
, VARCHAR
, BLOB
및 TEXT
)을 제외하고 행의 최대 길이는 데이터베이스 페이지의 절반보다 조금 짧아집니다. 즉, 행의 최대 길이는 8000 바이트입니다. LONGBLOB
및 LONGTEXT
컬럼은 4G 바이트 미만이어야, BLOB
및 TEXT
컬럼을 포함하는 행 전체 길이는 4G 바이트 미만이어야합니다.
줄의 길이가 한 페이지의 절반보다 짧은 경우는 행 전체가 그 페이지 내에 로컬로 저장됩니다. 그것이 1 페이지의 절반이 넘는 경우 행이 1 페이지의 절반에 고정 될 때까지 외부 오프 페이지 스토리지로 가변 길이 컬럼이 선택됩니다. 오프 페이지 스토리지로 선택된 컬럼의 경우, InnoDB
는 첫 번째 768 바이트 행에 로컬로 저장하고 나머지는 외부 오버 플로우 페이지에 저장합니다. 이러한 각 열에는 오버 플로우 페이지의 자신의 목록이 있습니다. 768 바이트의 프리픽스는 그 컬럼의 실제 길이를 저장하고 값의 나머지 부분이 포함되어 오버 플로우 페이지 목록을 가리키는 20 바이트의 값이 수반합니다