Loading...
MySQL 9.5 Reference Manual 9.5의 10.4.7 Limits on Table Column Count and Row Size의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
이 섹션에서는 테이블에 포함될 수 있는 컬럼 수와 개별 행 크기에 대한 한계를 설명합니다.
MySQL은 테이블당 4096개 컬럼이라는 하드 한계를 가지지만, 실제 최대값은 특정 테이블에 대해 더 작을 수 있습니다. 정확한 컬럼 한계는 여러 요인에 따라 달라집니다:
테이블의 최대 행 크기는 컬럼 수(그리고 경우에 따라 컬럼 크기)를 제한하는데, 모든 컬럼의 전체 길이가 이 크기를 초과할 수 없기 때문입니다. Row Size Limits를 참조하십시오.
개별 컬럼의 저장 요구 사항은 주어진 최대 행 크기 안에 들어갈 수 있는 컬럼 수를 제한합니다. 일부 데이터 타입의 저장 요구 사항은 스토리지 엔진, 스토리지 포맷, 문자 집합과 같은 요인에 따라 달라집니다. Section 13.7, “Data Type Storage Requirements”를 참조하십시오.
스토리지 엔진은 테이블 컬럼 수를 제한하는 추가 제약을 가할 수 있습니다. 예를 들어, InnoDB는 테이블당 1017개 컬럼이라는 한계를 가집니다. Section 17.21, “InnoDB Limits”를 참조하십시오. 다른 스토리지 엔진에 대한 정보는 Chapter 18, Alternative Storage Engines를 참조하십시오.
Functional key part(참조: Section 15.1.18, “CREATE INDEX Statement”)는 숨겨진 가상 생성 저장 컬럼으로 구현되므로, 테이블 인덱스의 각 functional key part는 테이블 전체 컬럼 수 한계에 포함됩니다.
특정 테이블에 대한 최대 행 크기는 여러 요인에 의해 결정됩니다:
MySQL 테이블의 내부 표현은 스토리지 엔진이 더 큰 행을 지원할 수 있는 능력이 있더라도 65,535 bytes의 최대 행 크기 한계를 가집니다. BLOB 및 TEXT 컬럼은 그 내용이 행의 나머지 부분과는 별도로 저장되기 때문에 행 크기 한계에 9~12 bytes만 기여합니다.
InnoDB 테이블에 대한 최대 행 크기(데이터베이스 페이지 내에 로컬로 저장되는 데이터에 적용됨)는 4KB, 8KB, 16KB, 32KB innodb_page_size 설정에 대해 페이지의 절반보다 약간 작습니다. 예를 들어, 기본 16KB InnoDB 페이지 크기의 경우 최대 행 크기는 8KB보다 약간 작습니다. 64KB 페이지의 경우 최대 행 크기는 16KB보다 약간 작습니다. Section 17.21, “InnoDB Limits”를 참조하십시오.
variable-length columns를 포함하는 행이 InnoDB 최대 행 크기를 초과하면, InnoDB는 행이 InnoDB 행 크기 한계에 들어맞을 때까지 variable-length 컬럼을 외부 off-page 스토리지로 선택합니다. Off-page로 저장되는 variable-length 컬럼에 대해 로컬로 저장되는 데이터의 양은 행 포맷에 따라 다릅니다. 자세한 내용은 Section 17.10, “InnoDB Row Formats”를 참조하십시오.
서로 다른 스토리지 포맷은 서로 다른 양의 페이지 헤더 및 트레일러 데이터를 사용하며, 이는 행에 사용할 수 있는 저장 용량에 영향을 미칩니다.
InnoDB 행 포맷에 대한 정보는 Section 17.10, “InnoDB Row Formats”를 참조하십시오.
MyISAM 스토리지 포맷에 대한 정보는 Section 18.2.3, “MyISAM Table Storage Formats”를 참조하십시오.
InnoDB 및 MyISAM 예시에서 보여집니다. 스토리지 엔진이 더 큰 행을 지원할 수 있는 능력이 있더라도, 이 한계는 스토리지 엔진과 무관하게 강제됩니다.1mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), 2 c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), 3 f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1; 4ERROR 1118 (42000): Row size too large. The maximum row size for the used 5table type, not counting BLOBs, is 65535. This includes storage overhead, 6check the manual. You have to change some columns to TEXT or BLOBs
1mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), 2 c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), 3 f VARCHAR(10000), g VARCHAR(6000)) ENGINE=MyISAM CHARACTER SET latin1; 4ERROR 1118 (42000): Row size too large. The maximum row size for the used 5table type, not counting BLOBs, is 65535. This includes storage overhead, 6check the manual. You have to change some columns to TEXT or BLOBs
다음 MyISAM 예시에서, 컬럼을 TEXT로 변경하면 65,535-byte 행 크기 한계를 피하고 연산을 성공하도록 허용합니다. 이는 BLOB 및 TEXT 컬럼이 행 크기에 9~12 bytes만 기여하기 때문입니다.
1mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), 2 c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), 3 f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1; 4Query OK, 0 rows affected (0.02 sec)
InnoDB 테이블의 경우, 컬럼을 TEXT로 변경하면 MySQL 65,535-byte 행 크기 한계를 피할 수 있고, InnoDB의 variable-length 컬럼 off-page 스토리지로 인해 InnoDB 행 크기 한계를 피할 수 있기 때문에 연산이 성공합니다.
1mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), 2 c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), 3 f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1; 4Query OK, 0 rows affected (0.02 sec)
VARCHAR(255) CHARACTER SET utf8mb3 컬럼은 값의 길이를 저장하기 위해 두 개의 byte를 사용하므로, 각 값은 최대 767 bytes까지 사용할 수 있습니다.테이블 t1을 생성하는 statement는 컬럼들이 32,765 + 2 bytes와 32,766 + 2 bytes를 요구하며, 이는 65,535 bytes 최대 행 크기 안에 들어가기 때문에 성공합니다:
1mysql> CREATE TABLE t1 2 (c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL) 3 ENGINE = InnoDB CHARACTER SET latin1; 4Query OK, 0 rows affected (0.02 sec)
테이블 t2를 생성하는 statement는 컬럼 길이가 65,535 bytes 최대 길이 안에 있더라도 길이를 기록하기 위한 2개의 추가 byte가 필요하여 행 크기가 65,535 bytes를 초과하게 되므로 실패합니다:
1mysql> CREATE TABLE t2 2 (c1 VARCHAR(65535) NOT NULL) 3 ENGINE = InnoDB CHARACTER SET latin1; 4ERROR 1118 (42000): Row size too large. The maximum row size for the used 5table type, not counting BLOBs, is 65535. This includes storage overhead, 6check the manual. You have to change some columns to TEXT or BLOBs
컬럼 길이를 65,533 이하로 줄이면 statement가 성공할 수 있습니다.
1mysql> CREATE TABLE t2 2 (c1 VARCHAR(65533) NOT NULL) 3 ENGINE = InnoDB CHARACTER SET latin1; 4Query OK, 0 rows affected (0.01 sec)
MyISAM 테이블의 경우, NULL 컬럼은 값이 NULL인지 여부를 기록하기 위해 행 내에서 추가 공간을 필요로 합니다. 각 NULL 컬럼은 한 bit의 추가 공간을 사용하며, 이는 가장 가까운 byte로 올림 처리됩니다.테이블 t3를 생성하는 statement는 MyISAM이 variable-length 컬럼의 length byte에 필요한 공간 외에 NULL 컬럼에 대한 공간도 요구하므로 행 크기가 65,535 bytes를 초과하게 되어 실패합니다:
1mysql> CREATE TABLE t3 2 (c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL) 3 ENGINE = MyISAM CHARACTER SET latin1; 4ERROR 1118 (42000): Row size too large. The maximum row size for the used 5table type, not counting BLOBs, is 65535. This includes storage overhead, 6check the manual. You have to change some columns to TEXT or BLOBs
InnoDB의 NULL 컬럼 저장에 대한 정보는 Section 17.10, “InnoDB Row Formats”를 참조하십시오.
InnoDB는 (데이터베이스 페이지 내에 로컬로 저장되는 데이터에 대해) 4KB, 8KB, 16KB, 32KB innodb_page_size 설정에서 행 크기를 데이터베이스 페이지의 절반보다 약간 작은 값으로 제한하며, 64KB 페이지의 경우 16KB보다 약간 작은 값으로 제한합니다.테이블 t4를 생성하는 statement는 정의된 컬럼이 16KB InnoDB 페이지에 대한 행 크기 한계를 초과하기 때문에 실패합니다:
1mysql> CREATE TABLE t4 ( 2 c1 CHAR(255),c2 CHAR(255),c3 CHAR(255), 3 c4 CHAR(255),c5 CHAR(255),c6 CHAR(255), 4 c7 CHAR(255),c8 CHAR(255),c9 CHAR(255), 5 c10 CHAR(255),c11 CHAR(255),c12 CHAR(255), 6 c13 CHAR(255),c14 CHAR(255),c15 CHAR(255), 7 c16 CHAR(255),c17 CHAR(255),c18 CHAR(255), 8 c19 CHAR(255),c20 CHAR(255),c21 CHAR(255), 9 c22 CHAR(255),c23 CHAR(255),c24 CHAR(255), 10 c25 CHAR(255),c26 CHAR(255),c27 CHAR(255), 11 c28 CHAR(255),c29 CHAR(255),c30 CHAR(255), 12 c31 CHAR(255),c32 CHAR(255),c33 CHAR(255) 13 ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET latin1; 14ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. 15In current row format, BLOB prefix of 0 bytes is stored inline.
10.4.6 Limits on Table Size
10.5 Optimizing for InnoDB Tables