文字列型カラム
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.