MySQL の単一テーブルごとに作成されるインデックスの長さは制限されており、ストレージ エンジンごとにテーブルに異なる制限があります。
MyISAM テーブルでは、結合インデックスを作成する場合、作成されるインデックスの長さは 1000 を超えることはできません。ここでのインデックスの長さの計算は、テーブル フィールドで設定された長さに基づいてスカラーであることに注意してください。次に例を示します。
create table test(id int,name1 varchar(300),name2 varchar(300),name3 varchar(500))charset=latin1 engine=myisam; create index test_name on test(name1,name2,name3);
この時点で報告されたエラー:
Specified key was too long;max key length is 1000 bytes.
変更されたテーブル構造:
alter table test convert to charset utf8; create index test_name3 on test(name3).
現時点での警告:
Specified key was too long;max key length is 1000 bytes.
しかし、インデックスは正常に作成されました。テーブル構造を見ると、作成されたインデックスがプレフィックス インデックスであることがわかります:
‘key test_name3(name3(333))’
結論は次のとおりです: myisam テーブルの場合、結合インデックスを作成する場合、作成されるインデックスの長さの合計は 1000 バイトを超えることはできません。エラーが報告され、作成は失敗します。myisam の単一列インデックスの場合、最大長は 1000 を超えるとアラームが発生しますが、作成は成功し、最終的にプレフィックス インデックスが作成されます。 333 バイトが使用されます)。
Innodb テーブルで複合インデックスを作成します:
create table test1(id int,name1 varchar(300),name2 varchar(300),name3 varchar(500))charset=latin1 engine=innodb; create index test1_name on test(name1,name2,name3);
これで
warning:Specified key was too long;max key length is 767 bytes.
alter table test1 convert to charset utf8; create index test1_name3 on test(name3).
が得られます。 結論は次のとおりです: innodb で複合インデックスを作成するには、もし各列の長さが 767 バイトを超えない場合、すべての列の長さの合計は計算されません。767 バイトを超える場合、インデックスは正常に作成されますが、列が 767 バイトを超えると、アラームが発生します。プレフィックス インデックスが取得されます。InnoDB の単一列インデックスの場合、767 を超えると警告が表示され、最終的にインデックスは正常に作成され、プレフィックス インデックスが取得されます (最初の 255 バイトが取得されます)。取られました)。