Som @Devart siger, er den samlede længde af dit indeks for lang.
Det korte svar er, at du alligevel ikke bør indeksere så lange VARCHAR-kolonner, fordi indekset vil være meget omfangsrigt og ineffektivt.
Den bedste praksis er at bruge præfiksindekser så du indekserer kun en venstre understreng af dataene. De fleste af dine data vil alligevel være meget kortere end 255 tegn.
Du kan angive en præfikslængde pr. kolonne, når du definerer indekset. For eksempel:
...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...
Men hvad er den bedste præfikslængde for en given kolonne? Her er en metode til at finde ud af:
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`;
Den fortæller dig andelen af rækker, der ikke har mere end en given strenglængde i menu_link
kolonne. Du kan muligvis se output som dette:
+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
| 21.78 | 80.20 | 100.00 | 100.00 |
+---------------+---------------+---------------+----------------+
Dette fortæller dig, at 80 % af dine strenge er mindre end 20 tegn, og alle dine strenge er mindre end 50 tegn. Så der er ingen grund til at indeksere mere end en præfikslængde på 50, og bestemt ingen grund til at indeksere den fulde længde på 255 tegn.
PS:INT(1)
og INT(32)
datatyper indikerer en anden misforståelse om MySQL. Det numeriske argument har ingen effekt relateret til lagring eller intervallet af værdier, der er tilladt for kolonnen. INT
er altid 4 bytes, og det tillader altid værdier fra -2147483648 til 2147483647. Det numeriske argument handler om udfyldning af værdier under visning, hvilket ikke har nogen effekt, medmindre du bruger ZEROFILL
mulighed.