文字列型カラム
InnoDBのファイルフォーマットによるインデックスの最大キー長の違い
基本的には単一カラムインデックスの最大キー長は767バイトまで作成できます。特定の条件ではインデックスの最大キー長を3072バイトまで拡張することができます。その条件は以下のとおりです。
- テーブル作成時に行フォーマットを
DYNAMIC
またはCOMPRESSED
に指定する。 innodb_
パラメータをfile_ per_ table ON
に設定して、テーブルデータを個別のibdファイルに格納するようにする。 innodb_
パラメータを有効にする。large_ prefix
はじめにテーブルの行フォーマットをDYNAMIC
、COMPRESSED
に指定します。そのためにはInnoDBのファイルフォーマットをBarracuda
に設定しておく必要があります。InnoDBのファイルフォーマットは旧フォーマットのAntelope
と新しいフォーマットのBarracuda
があり、innodb_
パラメータで指定します。デフォルトはMySQL5.Antelope
でMySQL5.Barracuda
となっており、
そして、ROW_
句を使用して、DYNAMIC
またはCOMPRESSED
に行フォーマットを設定します。
mysql> CREATE TABLE testtable ( id int ) ROW_FORMAT=DYNAMIC;
ここでは詳細なInnoDBのファイルフォーマットと行フォーマットの説明はしませんので、
次に、innodb_
をONに設定することで、
OFFの場合は、ibdata1
に格納されます。このパラメータは稼働中のMySQLに対してオンラインでの変更が可能ですが、ibdata1
に格納されているテーブルはそのままであり、
最後に、innodb_
パラメータを有効にすることで、
必要なパラメータのデフォルト値をまとめると、
パラメータ名 | デフォルト値 |
---|---|
innodb_ | 5. |
innodb_ | 5. |
innodb_ | 5. |
innodb_ | 5. |
Innodbページサイズによるインデックスの最大キー長の違い
先ほど説明したインデックスの最大キー長は3072バイトまで拡張可能ですが、innodb_
パラメータを使用してInnoDBのページサイズを8Kバイトまたは4Kバイトまで小さくすると、
これまでの結果を表にすると以下のようになります。
InnoDBページサイズ | 拡張したインデックスの最大キー長 | 拡張なしのインデックスの最大キー長 |
---|---|---|
16K | 3072バイト | 767バイト |
8k | 1536バイト | 767バイト |
4k | 768バイト | 767バイト |
文字コードの違いによる注意点
MySQLは、
そして、
utf8の場合
varchar(1024)までインデックスの作成が可能です
varchar(1025)は最大バイト数を超えてしまうため、
mysql> CREATE TABLE utf8table ( id serial , c1 varchar(1024), c2 varchar(1025) ) ROW_FORMAT=DYNAMIC, CHARSET=utf8;
mysql> ALTER TABLE utf8table ADD KEY(c1); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE utf8table ADD KEY(c2); ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes
utf8mb4の場合
varchar(768)までインデックスの作成が可能です
varchar(769)は最大バイト数を超えてしまうため、
mysql> CREATE TABLE utf8mb4table ( id serial , c1 varchar(768), c2 varchar(769) ) ROW_FORMAT=DYNAMIC, CHARSET=utf8mb4;
mysql> ALTER TABLE utf8mb4table ADD KEY(c1); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE utf8mb4table ADD KEY(c2); ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes
これにより、
たとえば、
補足として、sql_
パラメータにSTRICT_
が設定されている場合です。デフォルトはMySQL5.STRICT_
が設定されているので注意が必要です。
このSTRICT_
が設定されていない場合は、
mysql> ALTER TABLE utf8table ADD KEY(c2); Query OK, 0 rows affected, 1 warning (0.02 sec) Records: 0 Duplicates: 0 Warnings: 1 Warning (Code 1071): Specified key was too long; max key length is 3072 bytes
SHOW CREATE TABLE
構文で確認すると、
mysql> SHOW CREATE TABLE utf8table; CREATE TABLE `utf8table` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `c1` varchar(1024) DEFAULT NULL, `c2` varchar(1025) DEFAULT NULL, UNIQUE KEY `id` (`id`), KEY `c2` (`c2`(1024)), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
まとめ
InnoDBのインデックスの最大キー長は最大3072バイトまで拡張可能です。
MySQL5.