MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  テーブルカラム数と行サイズの制限

8.4.7 テーブルカラム数と行サイズの制限

このセクションでは、テーブルのカラム数および個々の行のサイズの制限について説明します。

カラム数制限

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 および 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.

関連キーワード:  InnoDB, テーブル, カラム, サイズ, VARCHAR, 制限, インデックス, バイト, ステートメント, 最大