ホームページ >データベース >mysql チュートリアル >MySQL の「指定されたキーが長すぎます。最大キー長は 1000 バイトです」エラーを解決する方法は?
インデックス定義の「指定されたキーが長すぎます」エラーの処理
エラー メッセージ「指定されたキーが長すぎます。最大キー長は次のとおりです」 1000 バイト」は、テーブルに定義されたインデックスの長さに問題があることを示します。このエラーは、データベース サーバーのバージョン、インデックス タイプ、列データなどの要因の影響を受ける可能性があるため、クエリが過去に正常に動作していた場合でも発生する可能性があります。
提供されたクエリ内:
CREATE TABLE IF NOT EXISTS `pds_core_menu_items` ( ... KEY `index` (`parent_menu_id`,`menu_link`,`plugin`,`alias`) ... )
インデックス Index は、parent_menu_id、menu_link、plugin、alias の 4 つの列で定義されます。これらの列を合わせた長さが 1000 バイトを超えているため、エラーが発生します。
この問題を解決するには、いくつかの方法があります。
1.インデックス列の長さを減らす:
エラーを修正する最も簡単な方法は、インデックス列の長さを減らすことです。これは、列データの一部のみにインデックスが付けられるプレフィックス インデックスを使用して実行できます。例:
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
プレフィックス インデックスは、効率的な検索を維持しながらインデックス サイズを大幅に削減できるため、推奨されます。
2.最適なプレフィックス長の決定:
各列の最適なプレフィックス長を決定するには、次のようなクエリを使用してデータ分布を分析すると役立ちます。
SELECT ROUND(SUM(LENGTH(`menu_link`)<10)*100/COUNT(`menu_link`),2) AS pct_length_10, ROUND(SUM(LENGTH(`menu_link`)<20)*100/COUNT(`menu_link`),2) AS pct_length_20, ROUND(SUM(LENGTH(`menu_link`)<50)*100/COUNT(`menu_link`),2) AS pct_length_50, ROUND(SUM(LENGTH(`menu_link`)<100)*100/COUNT(`menu_link`),2) AS pct_length_100 FROM `pds_core_menu_items`;
このクエリはパーセンテージを提供します。特定の長さ未満の列値を持つ行の数。これらの結果に基づいて、適切なプレフィックス長を選択して、良好なパフォーマンスを維持しながらインデックス サイズを最小限に抑えることができます。
追加の考慮事項:
エラーが発生することに注意することが重要です。この問題は、個々の列がすべて 1000 バイト未満であっても、インデックスの合計長が 1000 バイトを超える場合にも発生する可能性があります。したがって、複数の列にインデックスを定義する場合は、合計の長さを考慮する必要があります。
さらに、INT(1) および INT(32) データ型はインデックスの長さの問題とは関係ありません。ただし、これらのデータ型の数値引数はストレージや値の範囲には影響せず、表示時の書式設定に影響することに注意してください。
以上がMySQL の「指定されたキーが長すぎます。最大キー長は 1000 バイトです」エラーを解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。