Mysql
 sql >> Datenbank >  >> RDS >> Mysql

#1071 - Angegebener Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 1000 Byte

Wie @Devart sagt, ist die Gesamtlänge Ihres Index zu lang.

Die kurze Antwort ist, dass Sie so lange VARCHAR-Spalten sowieso nicht indizieren sollten, da der Index sehr sperrig und ineffizient wird.

Am besten verwenden Sie Präfix-Indizes Sie indizieren also nur einen linken Teilstring der Daten. Die meisten Ihrer Daten werden ohnehin viel kürzer als 255 Zeichen sein.

Sie können eine Präfixlänge pro Spalte deklarieren, während Sie den Index definieren. Zum Beispiel:

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

Aber was ist die beste Präfixlänge für eine bestimmte Spalte? Hier ist eine Methode, um das herauszufinden:

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

Es gibt Ihnen den Anteil der Zeilen an, die nicht mehr als eine bestimmte Zeichenfolgenlänge im menu_link haben Säule. Möglicherweise sehen Sie eine Ausgabe wie diese:

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

Dies sagt Ihnen, dass 80 % Ihrer Zeichenfolgen weniger als 20 Zeichen lang sind und alle Ihre Zeichenfolgen weniger als 50 Zeichen lang sind. Es ist also nicht erforderlich, mehr als eine Präfixlänge von 50 zu indizieren, und schon gar nicht die volle Länge von 255 Zeichen.

PS:Der INT(1) und INT(32) Datentypen weist auf ein weiteres Missverständnis über MySQL hin. Das numerische Argument hat keine Auswirkungen auf die Speicherung oder den für die Spalte zulässigen Wertebereich. INT ist immer 4 Bytes und erlaubt immer Werte von -2147483648 bis 2147483647. Das numerische Argument betrifft das Auffüllen von Werten während der Anzeige, was keine Auswirkung hat, es sei denn, Sie verwenden ZEROFILL Option.