27.10.4 테이블 컬럼 및 행 크기 제한
테이블 당 4096 컬럼는 하드 제한이 있지만, 특정 테이블에서 유효한 최대 수가 더 적을 수 있습니다. 정확한 제한은 상호 작용하는 여러 요인에 따라 다릅니다.
모든 테이블 (스토리지 엔진에 무관) 행의 최대 크기는 65,535 바이트입니다. 스토리지 엔진에서는이 제한 대해 더 제약을 추가하는 경우가 유효한 최대 행 크기는 줄어 듭니다.
모든 컬럼의 총 길이는 최대 행 크기를 초과 할 수 없기 때문에,이 크기는 컬럼 수 (및 크기의 수도)를 제한합니다. 예를 들어,
utf8
문자는 문자 당 최대 3 바이트가 필요하기 때문에,CHAR(255) CHARACTER SET utf8
컬럼의 경우, 서버는 값마다 255 × 3 = 765 바이트를 할당해야합니다. 이 결과 테이블에는 이러한 열을 65,535 / 765 = 85 이상 포함되지 않습니다.가변 길이 컬럼의 스토리지에 길이 바이트를 포함, 여기에는 행 크기에 대해 평가됩니다. 예를 들어,
VARCHAR(255) CHARACTER SET utf8
컬럼 값의 길이를 저장하는 2 바이트를 사용하므로 각각의 값은 최대 767 바이트를 사용할 수 있습니다.BLOB
컬럼과TEXT
컬럼은 그 내용이 행의 나머지에서 분리되어 저장되기 때문에 행 크기에 각각 9-12 (1 ~ 4 + 8) 바이트입니다.컬럼을
NULL
로 선언하면 사용할 수있는 최대 컬럼 수를 줄일 수 있습니다.MyISAM
테이블의 경우NULL
컬럼 값이NULL
인지 여부를 기록하기위한 추가 공간을 줄 필요합니다. 각NULL
컬럼은 1 비트 여분으로 차지해 가장 가까운 바이트로 반올림합니다. 바이트의 최대 유키나가는 다음과 같이 계산할 수 있습니다.row length = 1 + (
sum of column lengths
) + (number of NULL columns
+delete_flag
+ 7)/8 + (number of variable-length columns
)delete_flag
은 정적 행 형식의 테이블에 대해서는 1입니다. 정적 테이블은 행이 삭제되었는지 여부를 나타내는 플래그로 행 레코드의 1 비트를 사용합니다. 이 플래그는 동적 행 머리글에 저장되므로 동적 테이블의 경우delete_flag
은 0입니다.MyISAM
테이블 형식의 자세한 내용은 섹션 15.2.3 "MyISAM 테이블 스토리지 포맷" 을 참조하십시오.InnoDB
테이블의 경우 스토리지 크기는NULL
컬럼 및NOT NULL
컬럼의 경우와 동일하므로 위의 계산은 적용되지 않습니다.컬럼이 필요로하는 크기가 32,765 + 2 바이트와 32,766 + 2 바이트이며, 65,535 바이트의 최대 행 크기를 초과 하지 않으므로 테이블
t1
을 만드는 다음 문은 성공합니다.mysql>
CREATE TABLE t1
->(c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)
->ENGINE = MyISAM CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)컬럼은
NULL
이며,MyISAM
이 필요로하는 추가 공간은 행 크기가 65,535 바이트를 초과하므로 테이블t2
을 만들려면 다음 문은 실패합니다.mysql>
CREATE TABLE t2
->(c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)
->ENGINE = MyISAM CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs컬럼 길이는 65,535 바이트의 최대 길이에 들어가고 있습니다 만, 길이를 기록하기 위해 2 개의 추가 바이트가 필요하며,이를 위해 행 크기가 65,535 바이트를 초과하므로 테이블
t3
를 만들려면 다음 문 는 실패합니다.mysql>
CREATE TABLE t3
->(c1 VARCHAR(65535) NOT NULL)
->ENGINE = MyISAM CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs컬럼 길이를 65,533 이하로 줄이면 문은 성공합니다.
개별 스토리지 엔진에서 테이블 컬럼 수를 제한하는 기타 제약이 적용될 수 있습니다. 예 :
InnoDB
가 허용 컬럼 수는 1000입니다.InnoDB
는 데이터베이스 페이지 (약 8,000 바이트)의 절반 이하로 줄 크기를 제한하고VARBINARY
,VARCHAR
,BLOB
또는TEXT
컬럼을 포함하지 않습니다.다른
InnoDB
스토리지 포맷 (COMPRESSED
,REDUNDANT
)에서 사용하는 페이지 헤더 및 트레일러 데이터의 양이 다르기 때문에 행에 사용 가능한 스토리지 용량에 영향을 미칩니다.
각각의 테이블에는 테이블 정의를 포함
.frm
파일이 있습니다. 이 정의는 테이블에서 허용되는 열 수에 영향을 방법으로이 파일의 내용에 영향을 미칩니다. 자세한 내용은 섹션 D.10.5 ".frm 파일 구조에 의해 부과되는 제한" 을 참조하십시오.