SQL クエリのパフォーマンスの問題を調査中に、ユーザーは products.name 列にインデックスを追加してクエリを最適化しようとしました。 varchar(512) として定義されます。 product_name_idx (name(512)) として指定された元のインデックスは、プレフィックス インデックスとして識別されたため、並べ替えに使用されませんでした。
これに対処するために、ユーザーは name 列を切り詰めようとしました。 varchar(255) に。この変更の後、後続の EXPLAIN ステートメントは、インデックスが使用されていることを示しました。
この動作は、MySQL が UTF-8 文字の長さに関して行っている仮定に起因しています。 MySQL では、単一カラムの最大インデックス サイズは 767 バイトです。 MySQL 8.0 より前では、utf8 文字セットは 1 文字あたり最大 3 バイトに制限されていました。ただし、MySQL 8.0 ではこれが変更され、utf8mb3 は非推奨となり、1 文字あたり最大 4 バイトをサポートする utf8mb4 に置き換えられました。
8.0 より前の MySQL バージョンでは、デフォルトより大きいインデックス長を指定します。 varchar(255) 列に 255 文字を指定すると、エラーが発生します。これは、MySQL が UTF-8 の 1 文字あたり 3 バイトを想定しており、256 文字のインデックスは 767 バイトの制限を超えるためです。
MySQL 8.0 および utf8mb4 文字セットでは、1 文字あたり 3 バイトの想定が引き続き適用されます。 。ただし、圧縮された動的な行形式の導入により、インデックス キーのプレフィックスは最大 3072 バイトになる可能性があります。その結果、より多くの文字数を含む varchar カラムにインデックスを作成できるようになりました。
要約すると、以前の MySQL バージョンでは、varchar カラムのインデックス長の制限は、1 つあたり 3 バイトであると想定されていたため 255 文字でした。 UTF-8 文字と 767 バイトの最大インデックス サイズ。 MySQL 8.0 と utf8mb4 では、圧縮行フォーマットと動的行フォーマットに対してこの制限が緩和され、varchar 列でより長いインデックスを作成できるようになりました。
以上がMySQL の varchar インデックスの長さ制限がバージョンごとに異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。