sql >> Base de Datos >  >> RDS >> Mysql

#1071 - La clave especificada era demasiado larga; la longitud máxima de la clave es de 1000 bytes

Como dice @Devart, la longitud total de su índice es demasiado larga.

La respuesta corta es que no debería indexar columnas VARCHAR tan largas de todos modos, porque el índice será muy voluminoso e ineficiente.

La mejor práctica es usar índices de prefijos por lo que solo está indexando una subcadena izquierda de los datos. De todos modos, la mayoría de sus datos serán mucho más cortos que 255 caracteres.

Puede declarar una longitud de prefijo por columna a medida que define el índice. Por ejemplo:

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

Pero, ¿cuál es la mejor longitud de prefijo para una columna dada? Aquí hay un método para averiguarlo:

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

Le indica la proporción de filas que no tienen más de una longitud de cadena dada en el menu_link columna. Es posible que vea un resultado como este:

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

Esto le dice que el 80% de sus cadenas tienen menos de 20 caracteres y todas sus cadenas tienen menos de 50 caracteres. Por lo tanto, no es necesario indexar más de una longitud de prefijo de 50, y ciertamente no es necesario indexar la longitud total de 255 caracteres.

PD:El INT(1) y INT(32) tipos de datos indica otro malentendido acerca de MySQL. El argumento numérico no tiene ningún efecto relacionado con el almacenamiento o el rango de valores permitidos para la columna. INT siempre es de 4 bytes y siempre permite valores de -2147483648 a 2147483647. El argumento numérico se trata de valores de relleno durante la visualización, lo que no tiene efecto a menos que use el ZEROFILL opción.