sql >> データベース >  >> RDS >> Mysql

#1071-指定されたキーが長すぎました。キーの最大長は1000バイトです

    @Devartが言うように、インデックスの全長が長すぎます。

    簡単に言うと、インデックスは非常にかさばり、非効率になるため、このような長いVARCHAR列にインデックスを付けることはできません。

    ベストプラクティスは、プレフィックスインデックスを使用することです。 したがって、データの左側のサブストリングのみにインデックスを付けます。とにかく、ほとんどのデータは255文字よりもはるかに短くなります。

    インデックスを定義するときに、列ごとのプレフィックス長を宣言できます。例:

    ...
    KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
    ...
    

    しかし、特定の列に最適なプレフィックスの長さはどれくらいですか?調べる方法は次のとおりです。

    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`;
    

    menu_linkで指定された文字列の長さ以下の行の割合を示します 桁。次のような出力が表示される場合があります:

    +---------------+---------------+---------------+----------------+
    | pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
    +---------------+---------------+---------------+----------------+
    |         21.78 |         80.20 |        100.00 |         100.00 |
    +---------------+---------------+---------------+----------------+
    

    これは、文字列の80%が20文字未満であり、すべての文字列が50文字未満であることを示しています。したがって、プレフィックスの長さが50を超えるインデックスを作成する必要はなく、255文字の全長をインデックスに登録する必要もありません。

    PS:INT(1) およびINT(32) データ型は、MySQLに関する別の誤解を示しています。数値引数は、ストレージまたは列に許可されている値の範囲に関連する影響はありません。 INT は常に4バイトであり、常に-2147483648から2147483647までの値を許可します。数値引数は表示中の値のパディングに関するものであり、ZEROFILLを使用しない限り効果はありません。 オプション。



    1. OracleでRubyonRailsを構成するにはどうすればよいですか?

    2. SQL Serverで「datetimeoffset」を「datetime」に変換します(T-SQLの例)

    3. PleskCentOS7でMySQLをPerconaに置き換える方法

    4. Docker内で実行中のmysqlにmysqlワークベンチを接続する方法は?