このセクションでは、テーブルのカラム数および個々の行のサイズの制限について説明します。
MySQL にはテーブル当たり 4096 カラムの強い制限がありますが、特定のテーブルの有効な最大値が少なくなる可能性があります。 カラムの正確な制限は、いくつかの要因によって異なります:
すべてのカラムの合計長がこのサイズを超えることはできないため、テーブルの最大行サイズによってカラムの数 (および場合によってはサイズ) が制限されます。 行サイズ制限を参照してください。
個々のカラムの記憶域要件によって、指定された最大行サイズ内に収まるカラム数が制限されます。 一部のデータ型の記憶域要件は、記憶域エンジン、記憶域形式、文字セットなどの要因によって異なります。 セクション11.7「データ型のストレージ要件」を参照してください。
ストレージエンジンは、テーブルカラム数を制限する追加の制限を課す場合があります。 たとえば、
InnoDB
には、テーブル当たり 1017 カラムの制限があります。 セクション15.22「InnoDB の制限」を参照してください。 その他のストレージエンジンについては、第16章「代替ストレージエンジン」 を参照してください。関数キー部分 (セクション13.1.15「CREATE INDEX ステートメント」 を参照) は、非表示の仮想生成ストアドカラムとして実装されるため、テーブルインデックス内の各関数キー部分は、テーブルの合計カラム制限に対してカウントされます。
特定のテーブルの最大行サイズは、いくつかの要因によって決定されます:
ストレージエンジンがより大きな行をサポートできる場合でも、MySQL テーブルの内部表現の最大行サイズは 65,535 バイトです。
BLOB
およびTEXT
のカラムは、行サイズ制限に 9 から 12 バイトのみ寄与します。これは、その内容が行の他の部分とは別に格納されるためです。-
データベースページ内にローカルに格納されたデータに適用される
InnoDB
テーブルの最大行サイズは、4KB、8KB、16KB および 32KB のinnodb_page_size
設定のページの半分未満です。 たとえば、デフォルトの 16KB のInnoDB
ページサイズでは、最大行サイズは 8KB 未満です。 64KB ページの場合、最大行サイズは 16KB 未満です。 セクション15.22「InnoDB の制限」を参照してください。variable-length columns を含む行が
InnoDB
の最大行サイズを超える場合、InnoDB
は、行がInnoDB
の行サイズ制限内に収まるまで、外部オフページストレージの可変長カラムを選択します。 ページ外に格納される可変長カラムに対してローカルに格納されるデータ量は、行形式によって異なります。 詳細は、セクション15.10「InnoDB の行フォーマット」を参照してください。 -
記憶域形式が異なると、ページヘッダーおよびトレーラデータが異なるため、行に使用可能な記憶域の量に影響します。
InnoDB
の行フォーマットの詳細は、セクション15.10「InnoDB の行フォーマット」 を参照してください。MyISAM
記憶域形式の詳細は、セクション16.2.3「MyISAM テーブルのストレージフォーマット」 を参照してください。
行サイズ制限の例
-
次の
InnoDB
およびMyISAM
の例では、65,535 バイトの MySQL 最大行サイズ制限を示します。 この制限は、ストレージエンジンがより大きな行をサポートできる場合でも、ストレージエンジンに関係なく適用されます。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
次の
MyISAM
の例では、カラムをTEXT
に変更すると、65,535-byte の行サイズ制限が回避され、BLOB
およびTEXT
のカラムは行サイズに 9 から 12 バイトしか寄与しないため、操作を成功させることができます。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)
カラムを
TEXT
に変更すると MySQL 65,535-byte の行サイズ制限が回避され、可変長カラムのInnoDB
オフページストレージによってInnoDB
の行サイズ制限が回避されるため、InnoDB
テーブルに対する操作は成功します。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 バイトを使用できます。カラムに 32,765 + 2 バイトおよび 32,766 + 2 バイトが必要で、これは最大行サイズ 65,535 バイト内にあるため、テーブル
t1
を作成するステートメントは成功します: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)
カラムの長さが 65,535 バイトの最大長内にあるにもかかわらず、行サイズが 65,535 バイトを超えるため、テーブル
t2
を作成するステートメントは失敗します: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 ビット余分に占め、もっとも近いバイトまで丸められます。MyISAM
には可変長のカラム長バイトに必要な領域に加えてNULL
カラムの領域が必要であり、行サイズが 65,535 バイトを超えるため、テーブルt3
を作成するステートメントは失敗します: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
InnoDB
NULL
カラムの記憶域の詳細は、セクション15.10「InnoDB の行フォーマット」 を参照してください。 -
InnoDB
では、行サイズ (データベースページ内にローカルに格納されるデータの場合) は、4KB、8KB、16KB および 32KB のinnodb_page_size
設定ではデータベースページの半分未満に制限され、64KB ページでは 16KB 未満に制限されます。定義されたカラムが 16KB の
InnoDB
ページの行サイズ制限を超えているため、テーブルt4
を作成するステートメントは失敗します。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=DYNAMIC DEFAULT CHARSET latin1; ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.