Mysql
 sql >> Database >  >> RDS >> Mysql

#1071 - La chiave specificata era troppo lunga; la lunghezza massima della chiave è 1000 byte

Come dice @Devart, la lunghezza totale del tuo indice è troppo lunga.

La risposta breve è che non dovresti comunque indicizzare colonne VARCHAR così lunghe, perché l'indice sarà molto ingombrante e inefficiente.

La procedura consigliata consiste nell'utilizzare indici di prefissi quindi stai solo indicizzando una sottostringa sinistra dei dati. La maggior parte dei tuoi dati sarà comunque molto più breve di 255 caratteri.

Puoi dichiarare una lunghezza del prefisso per colonna mentre definisci l'indice. Ad esempio:

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

Ma qual è la migliore lunghezza del prefisso per una determinata colonna? Ecco un metodo per scoprirlo:

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

Ti dice la proporzione di righe che non hanno più di una determinata lunghezza di stringa nel menu_link colonna. Potresti vedere un output come questo:

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

Questo ti dice che l'80% delle tue stringhe è inferiore a 20 caratteri e tutte le tue stringhe sono inferiori a 50 caratteri. Quindi non è necessario indicizzare più di una lunghezza del prefisso di 50 e certamente non è necessario indicizzare l'intera lunghezza di 255 caratteri.

PS:il INT(1) e INT(32) tipi di dati indica un altro malinteso su MySQL. L'argomento numerico non ha alcun effetto correlato all'archiviazione o all'intervallo di valori consentito per la colonna. INT è sempre 4 byte e consente sempre valori compresi tra -2147483648 e 2147483647. L'argomento numerico riguarda il riempimento dei valori durante la visualizzazione, che non ha alcun effetto a meno che non si utilizzi ZEROFILL opzione.