Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


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

D.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 バイト) の半分以下に行サイズを制限し、VARBINARYVARCHARBLOB、または TEXT カラムを含みません。

    • 異なる InnoDB ストレージフォーマット (COMPRESSEDREDUNDANT) では、使用するページヘッダーおよびトレーラデータの量が違うため、行に使用できるストレージ量に影響がおよびます。

  • それぞれのテーブルにはテーブル定義を含む .frm ファイルがあります。この定義は、テーブルで許可されるカラム数に影響する方法でこのファイルの内容に影響を与えます。詳細は、セクションD.10.5「.frm ファイル構造により課せられる制限」を参照してください。


User Comments
Sign Up Login You must be logged in to post a comment.