14.2.13.7 물리적 행 구조
InnoDB
테이블의 실제 행 구조는 테이블 생성시 지정된 행 형식에 따라 다릅니다. InnoDB
의 기본은 Antelope 파일 형식과 COMPACT
행 형식이 사용됩니다. REDUNDANT
형식은 이전 MySQL 버전과의 호환성을 위해 사용할 수 있습니다. 섹션 14.9 "InnoDB의 행 스토리지 및 행 형식" 과 섹션 14.7 "InnoDB 압축 테이블" 에서 설명하도록 innodb_file_per_table
설정을 사용하면 새로운 Barracuda 파일 형식을 DYNAMIC
및 COMPRESSED
행 형식과 함께 사용할 수 있습니다.
InnoDB
테이블의 행 형식을 확인하려면 SHOW TABLE STATUS
를 사용합니다. 예 :
mysql> SHOW TABLE STATUS IN test1 \ G *************************** 1. row ******************** ******* Name : t1 Engine : InnoDB Version : 10 Row_format : Compact Rows : 0 Avg_row_length : 0 Data_length : 16384 Max_data_length : 0 Index_length : 16384 Data_free : 0 Auto_increment : 1 Create_time : 2014-10-31 16:02:01 Update_time : NULL Check_time : NULL Collation : latin1_swedish_ci Checksum : NULL Create_options : Comment : 1 row in set (0.00 sec)
INFORMATION_SCHEMA.INNODB_SYS_TABLES
에서 쿼리를 실행하면 InnoDB
테이블의 행 형식을 확인하실 수 있습니다.
mysql> SELECT NAME, ROW_FORMAT FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test1/t1'; +----------+------------+ | NAME | ROW_FORMAT | +----------+------------+ | test1/t1 | Compact | +----------+------------+
COMPACT
행 형식을 사용하면 행의 저장 공간이 약 20 % 감소하지만 일부 작업에서는 CPU 사용률이 높아집니다. 워크로드가 캐시 적중률과 디스크 속도에 의해 제한되는 일반적인 워크로드라면 COMPACT
형식이 빠를 수 있습니다. 작업 부하가 CPU 속도에 의해 제한되는 드문 경우는 COMPACT
형식이 느려질 수 있습니다.
REDUNDANT
행 형식을 사용하는 InnoDB
테이블의 행에는 다음과 같은 특성이 있습니다.
각 인덱스 레코드는 6 바이트 헤더가 포함되어 있습니다. 이 헤더는 연속 된 레코드를 연결하는 데 사용됩니다. 또한 행 수준 잠금으로도 사용됩니다.
클러스터 된 인덱스의 레코드는 모든 사용자 정의 컬럼의 필드가 포함됩니다. 또한 6 바이트의 트랜잭션 ID 필드와 7 바이트 역할 포인터 필드도 포함되어 있습니다.
테이블에 기본 키가 정의되지 않은 경우, 각 클러스터 된 인덱스 레코드에 6 바이트의 행 ID 필드도 포함되어 있습니다.
각 보조 인덱스 레코드는 보조 인덱스에 존재하지 않는 클러스터 된 인덱스 키에 정의 된 모든 기본 키 필드도 포함되어 있습니다.
레코드는 레코드의 각 필드에 대한 포인터가 포함됩니다. 레코드의 필드 길이의 합계가 128 바이트 미만의 경우는 포인터가 1 바이트 128 바이트 이상의 경우는 포인터가 2 바이트입니다. 이러한 포인터의 배열은 레코드 디렉토리라고합니다. 이 포인터가 가리키는 영역 레코드의 데이터 부분이라고합니다.
InnoDB
는 내부적으로 고정 길이 형식의CHAR(10)
등의 고정 길이 문자 컬럼이 포함됩니다.InnoDB
는VARCHAR
컬럼에서 후행 공백을 자르지 않습니다.SQL의
NULL
값은 레코드 디렉토리에 1 바이트 또는 2 바이트가 예약됩니다. 그외에도 SQL의NULL
값은 가변 길이 컬럼에 저장되는 레코드의 데이터 부분에 0 바이트가 예약됩니다. 고정 길이 컬럼에서는 레코드의 데이터 부분에 컬럼의 고정 길이가 예약됩니다.NULL
값에 고정 영역을 예약하면 인덱스 페이지의 조각화가 발생하지 않고 컬럼을NULL
에서 비NULL
값을 업데이트 할 수 있습니다.
COMPACT
행 형식을 사용하는 InnoDB
테이블의 행에는 다음과 같은 특성이 있습니다.
각 인덱스 레코드는 전에 가변 길이 헤더가 붙는 수있는 5 바이트의 헤더가 포함되어 있습니다. 이 헤더는 연속 된 레코드를 연결하는 데 사용됩니다. 또한 행 수준 잠금으로도 사용됩니다.
레코드 헤더의 가변 길이 부분에는
NULL
열을 나타내는 비트 벡터가 포함되어 있습니다.NULL
로 할 수있는 인덱스의 컬럼 수가N
인 경우는 비트 벡터에서CEILING(
바이트가 점유됩니다. (예를 들어,N
/8)NULL
로 할 수있는 열이 9에서 15까지의 숫자 만 존재하는 경우, 비트 벡터로 2 바이트가 사용됩니다.)이 벡터의 비트 이외의 영역은NULL
컬럼에서 점유되지 않습니다. 헤더의 가변 길이 부분에는 가변 길이 컬럼의 길이도 포함되어 있습니다. 각 길이는 컬럼의 최대 길이에 따라 1 바이트와 2 바이트 중 하나입니다. 인덱스의 모든 컬럼이NOT NULL
이면서 고정 길이 인 경우 레코드 헤더는 가변 길이 부분이 포함되지 않습니다.비
NULL
가변 길이 필드마다 레코드 헤더에 1 바이트 또는 2 바이트의 컬럼 길이가 포함됩니다. 컬럼의 일부가 외부 오버 플로우 페이지에 저장되거나 최대 길이가 255 바이트를 초과 실제 길이가 127 바이트를 초과하는 경우에만 2 바이트가 필요합니다. 열이 외부에 저장된 경우 2 바이트 길이는 내부에 포함 된 부분의 길이에 외부에 저장된 부분에 20 바이트의 포인터를 더한 길이를 나타냅니다. 안 부분은 768 바이트이기 때문에 길이는 768 + 20입니다. 20 바이트의 포인터는 그 컬럼의 실제 길이가 포함됩니다.레코드 헤더 다음에는 비
NULL
컬럼의 데이터 내용이 나옵니다.클러스터 된 인덱스의 레코드는 모든 사용자 정의 컬럼의 필드가 포함됩니다. 또한 6 바이트의 트랜잭션 ID 필드와 7 바이트 역할 포인터 필드도 포함되어 있습니다.
테이블에 기본 키가 정의되지 않은 경우, 각 클러스터 된 인덱스 레코드에 6 바이트의 행 ID 필드도 포함되어 있습니다.
각 보조 인덱스 레코드는 보조 인덱스에 존재하지 않는 클러스터 된 인덱스 키에 정의 된 모든 기본 키 필드도 포함되어 있습니다. 이러한 기본 키 필드 중 하나가 가변 길이 인 경우, 각 보조 인덱스 레코드 헤더에는 그 보조 인덱스가 고정 길이 컬럼에 정의되어있는 경우에도 그 필드의 길이를 기록하기위한 가변 길이 부분이 포함됩니다.
InnoDB
는 내부적으로 고정 길이 형식의CHAR(10)
등의 고정 길이 고정 폭 문자 컬럼이 포함됩니다.InnoDB
는VARCHAR
컬럼에서 후행 공백을 자르지 않습니다.InnoDB
는 후속 영역을 잘라내는 내부적으로 UTF-8CHAR(
컬럼을N
)N
바이트로 저장하려고합니다. (REDUNDANT
행 형식으로이 같은 열에서 3 ×N
바이트를 차지합니다.) 많은 경우는 최소 영역N
을 예약하면 인덱스 페이지의 조각화가 발생하지 않고 컬럼의 업데이트를 성공적으로 실행할 수 있습니다.