コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

MySQL5.7.17のバージョンでデフォルトの設定だとindexの最大バイト数に制約がある

困った、という感じだったので原理をメモる。

環境

mysql> select version();
+------------+
| version()  |
+------------+
| 5.7.17-log |
+------------+
1 row in set (0.01 sec)

事象

indexを貼ろうとしたときに対象のカラムのバイト数が767byteを超えると

Index column size too large. The maximum column size is 767 bytes.

というような表示が出て、エラーとなる。

対策

以下のように設定値を変更する

innodb_large_prefix=ON
innodb_file_format=Barracuda
innodb_file_format_max=Barracuda

それぞれのオプションの意味

項目ごとにドキュメントの記載を見ていく。

なお、ファイル形式のAntelopeとBarracudaの差異に関しては以下のkamipoさんのブログを見ると良い

InnoDBの制限とファイルフォーマットAntelopeとBarracudaの違い - かみぽわーる

innodb_large_prefix

このオプションを有効にすると、DYNAMIC および COMPRESSED 行フォーマットを使用する InnoDB テーブルで、767 バイトよりも長い (最大で 3072 バイトの) インデックスキープリフィクスが許可されます。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

innodb_file_format

新しい InnoDB テーブルで使用されるファイル形式です。現在は、Antelope および Barracuda がサポートされています。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

innodb_file_format_max

サーバーの起動時に InnoDB によって、この変数の値がシステムテーブルスペースのファイル形式タグ (Antelope や Barracuda など) に設定されます。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

参考リンク