問題の概要:
の場合次のクエリを実行しようとしています:
CREATE TABLE IF NOT EXISTS `pds_core_menu_items` ( ... KEY `index` (`parent_menu_id`,`menu_link`,`plugin`,`alias`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
エラーです発生しました:「#1071 - 指定されたキーが長すぎます。最大キー長は 1000 バイトです。」
説明:
このエラーは、列の合計の長さが異なる場合に発生します。インデックス内のキーが最大許容キー長の 1000 バイトを超えています。この場合、pds_core_menu_items テーブルに作成されたインデックスには、parent_menu_id、menu_link、plugin、alias の 4 つの列が含まれており、それぞれの長さは 32、255、255、255 バイトです。
:
この問題を解決するには、短い列の長さを使用するか、インデックスに含まれる列の数を制限することによって、インデックスのサイズを変更します。
推奨されるアプローチ:
推奨されるアプローチは、プレフィックス インデックスを使用することです。インデックスのサイズとパフォーマンスを最適化します。接頭辞インデックスには、文字列列の最初の数文字のみのインデックス作成が含まれます。このアプローチにより、インデックスの長さを大幅に短縮できます。
たとえば、次の変更されたクエリは、4 つの列のそれぞれにプレフィックス インデックスを作成します。
CREATE TABLE IF NOT EXISTS `pds_core_menu_items` ( ... KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
補足:
さらに、クエリ内の INT(1) および INT(32) データ型は影響しないことに注意してください。列のストレージ サイズまたは値の範囲。 INT は常に 4 バイトのストレージを使用し、-2147483648 から 2147483647 までの値を許可します。数値引数は表示中の値のパディングに影響を与える可能性がありますが、これは ZEROFILL が使用されない限り関係ありません。
以上がMySQL が「指定されたキーが長すぎます。最大キー長は 1000 バイトです」を返すのはなぜですか?また、それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。