MySQL의 행과 열 수에 제한이 있나요?

MySQL의 행과 열 수에 제한이 있나요?

물론 Mysql의 행 제한은 65535바이트이고 Mysql의 열 제한은 4096이지만 InnoDB 엔진의 열 수는 추가로 1017열로 제한됩니다.

공식 문서의 설명을 참조하세요.

열 제한

MySQL에는 테이블당 4096개의 열이라는 엄격한 제한이 있지만 특정 테이블에 대한 유효 최대값은 더 적을 수 있습니다. 정확한 열 제한은 다음과 같은 여러 요인에 따라 달라집니다.

모든 열의 전체 길이가 이 크기를 초과할 수 없기 때문에 테이블의 최대 행 크기는 열 수(및 가능한 경우 크기)를 제한합니다. 행 크기 제한을 참조하세요.

단일 열의 저장 요구 사항에 따라 지정된 최대 행 크기에 맞는 열 수가 제한됩니다. 특정 데이터 유형에 대한 저장소 요구 사항은 저장소 엔진, 저장소 형식, 문자 집합과 같은 요소에 따라 달라집니다. 섹션 11.7, “데이터 유형 저장 요구 사항”을 참조하십시오.

스토리지 엔진은 테이블 열 수를 제한하기 위해 추가 제한을 적용할 수 있습니다. 예를 들어 InnoDB는 테이블당 1017개의 열로 제한됩니다. 섹션 14.23, “InnoDB 제한 사항”을 참조하세요. 다른 스토리지 엔진에 대한 자세한 내용은 15장 대체 스토리지 엔진을 참조하세요.

각 테이블에는 테이블 정의가 포함된 .frm 파일이 있습니다. 이 정의는 테이블에 허용되는 열 수에 영향을 미칠 수 있는 방식으로 이 파일의 내용에 영향을 줍니다. .frm 파일 구조에 따른 제한 사항을 참조하세요.

행 크기 제한

특정 테이블의 최대 행 크기는 여러 요소에 의해 결정됩니다.

MySQL 테이블의 내부 표현에는 스토리지 엔진이 더 큰 행을 지원할 수 있더라도 최대 행 크기 제한이 65,535바이트입니다. BLOB 및 TEXT 열의 내용은 행의 나머지 부분과 별도로 저장되므로 행 크기 제한에 9~12바이트만 기여합니다.

데이터베이스 페이지에 로컬로 저장된 데이터에 적용되는 InnoDB 테이블의 최대 행 크기는 4KB, 8KB, 16KB 및 32KB 설정의 경우 페이지의 절반보다 약간 작습니다. 예를 들어 기본 16KB 페이지 크기 innodb_page_size의 경우 최대 행 크기는 8KB보다 약간 작습니다. InnoDB의 최대 행 크기는 64KB 페이지에 대해 16KB보다 약간 작습니다. 섹션 14.23, “InnoDB 제한 사항”을 참조하세요.

가변 길이 열을 포함하는 행이 InnoDB 최대 행 크기를 초과하는 경우 InnoDB는 행이 InnoDB 행 크기 제한을 충족할 때까지 외부 오프 페이지 저장을 위해 가변 길이 열을 선택합니다. 페이지 외부에 저장된 가변 길이 열의 경우 로컬에 저장되는 데이터의 양은 행 형식에 따라 다릅니다. 자세한 내용은 섹션 14.11, “InnoDB 행 형식”을 참조하세요.

다양한 저장 형식은 서로 다른 양의 헤더 및 트레일러 데이터를 사용하며 이는 행에 사용 가능한 저장 공간에 영향을 미칩니다.

InnoDB 행 형식에 대한 자세한 내용은 섹션 14.11, “InnoDB 행 형식”을 참조하세요.

MyISAM 저장 형식에 대한 자세한 내용은 섹션 15.2.3, “MyISAM 테이블 저장 형식”을 참조하세요.

행 크기 제한 예

  • InnoDBMySQL의 최대 행 크기 제한은 65,535바이트이며 MyISAM다음 예에 나와 있습니다. 이 제한은 저장소 엔진이 더 큰 행을 지원할 수 있더라도 저장소 엔진에 관계없이 적용됩니다.

    mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
           c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
           f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;
    ERROR 1118 (42000): Row size too large. The maximum row size for the used
    table type, not counting BLOBs, is 65535. This includes storage overhead,
    check the manual. You have to change some columns to TEXT or BLOBs
    
    mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
           c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
           f VARCHAR(10000), g VARCHAR(6000)) 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. This includes storage overhead,
    check the manual. You have to change some columns to TEXT or BLOBs
    

    다음 예에서는 65,535바이트 행 크기 제한을 방지하고 열이 행 크기에 9~12바이트만 기여 하므로 작업이 성공할 수 있도록 MyISAM열을 변경합니다 .TEXTBLOBTEXT

    mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
           c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
           f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1;
    Query OK, 0 rows affected (0.02 sec)
    

    MySQL의 65,535바이트 행 크기 제한을 피하기 InnoDB위해 열이 변경되고 가변 길이 열의 오프 페이지 스토리지가 행 크기 제한을 피하기 때문에 테이블에 대한 작업이 성공합니다.TEXTInnoDBInnoDB

    mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
           c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
           f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1;
    Query OK, 0 rows affected (0.02 sec)
    
  • 가변 길이 열의 저장에는 행 크기에 포함되는 길이 바이트가 포함됩니다. 예를 들어 VARCHAR(255) CHARACTER SET utf8mb3열에는 값의 길이를 저장하는 데 2바이트가 필요하므로 각 값은 최대 767바이트를 차지할 수 있습니다.

    t1열에 32,765 + 2바이트 및 32,766 + 2바이트가 필요하기 때문에 테이블을 생성하는 문은 성공합니다. 이는 최대 행 크기인 65,535바이트 내에 있습니다.

    mysql> CREATE TABLE t1
           (c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)
           ENGINE = InnoDB CHARACTER SET latin1;
    Query OK, 0 rows affected (0.02 sec)
    

    t2열 길이가 최대 길이인 65,535바이트 내에 있더라도 길이를 기록하려면 추가 바이트 2개가 필요하여 행 크기가 65,535바이트를 초과하므로 테이블을 생성하는 문이 실패합니다 .

    mysql> CREATE TABLE t2
           (c1 VARCHAR(65535) NOT NULL)
           ENGINE = InnoDB CHARACTER SET latin1;
    ERROR 1118 (42000): Row size too large. The maximum row size for the used
    table type, not counting BLOBs, is 65535. This includes storage overhead,
    check the manual. You have to change some columns to TEXT or BLOBs
    

    열 길이를 65,533 이하로 줄이면 명령문이 성공할 수 있습니다.

    mysql> CREATE TABLE t2
           (c1 VARCHAR(65533) NOT NULL)
           ENGINE = InnoDB CHARACTER SET latin1;
    Query OK, 0 rows affected (0.01 sec)
    
  • MyISAM테이블 의 경우 NULL열의 값이 다음과 같은지 기록하려면 행에 추가 공간이 필요합니다 NULL. 각 NULL열은 가장 가까운 바이트로 반올림된 추가 비트 1개를 차지합니다.

    가변 길이 열 길이 바이트에 필요한 공간 외에 열 공간이 필요하여 테이블을 생성하는 문이 t3실패하여 행 크기가 65,535바이트를 초과하게 됩니다.MyISAMNULL

    mysql> CREATE TABLE t3
           (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. This includes storage overhead,
    check the manual. You have to change some columns to TEXT or BLOBs
    

    열 저장에 대한 자세한 내용은 섹션 14.11, “InnoDB 행 형식”을 참조하세요 .InnoDB NULL

  • InnoDBinnodb_page_size행 크기(데이터베이스 페이지에 로컬로 저장된 데이터의 경우)를 4KB, 8KB, 16KB 및 32KB 설정의 경우 데이터베이스 페이지의 절반보다 약간 작게 제한하고, 64KB 페이지의 경우 16KB보다 약간 작게 제한합니다.

    t4정의된 열이 InnoDB행 크기 제한인 16KB 페이지를 초과하여 테이블을 생성하는 문이 실패했습니다.

    mysql> CREATE TABLE t4 (
           c1 CHAR(255),c2 CHAR(255),c3 CHAR(255),
           c4 CHAR(255),c5 CHAR(255),c6 CHAR(255),
           c7 CHAR(255),c8 CHAR(255),c9 CHAR(255),
           c10 CHAR(255),c11 CHAR(255),c12 CHAR(255),
           c13 CHAR(255),c14 CHAR(255),c15 CHAR(255),
           c16 CHAR(255),c17 CHAR(255),c18 CHAR(255),
           c19 CHAR(255),c20 CHAR(255),c21 CHAR(255),
           c22 CHAR(255),c23 CHAR(255),c24 CHAR(255),
           c25 CHAR(255),c26 CHAR(255),c27 CHAR(255),
           c28 CHAR(255),c29 CHAR(255),c30 CHAR(255),
           c31 CHAR(255),c32 CHAR(255),c33 CHAR(255)
           ) ENGINE=InnoDB ROW_FORMAT=COMPACT DEFAULT CHARSET latin1;
    ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using
    ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768
    bytes is stored inline.
    

Supongo que te gusta

Origin blog.csdn.net/booynal/article/details/126131502
Recomendado
Clasificación