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.