Jak říká @Devart, celková délka vašeho indexu je příliš dlouhá.
Krátká odpověď je, že byste stejně neměli indexovat tak dlouhé sloupce VARCHAR, protože index bude velmi objemný a neefektivní.
Nejlepším postupem je používat indexy předpon takže indexujete pouze levý podřetězec dat. Většina vašich dat bude stejně mnohem kratší než 255 znaků.
Při definování indexu můžete deklarovat délku předpony na sloupec. Například:
...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...
Jaká je ale nejlepší délka předpony pro daný sloupec? Zde je způsob, jak to zjistit:
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`;
Říká vám podíl řádků, které nemají více než danou délku řetězce v menu_link
sloupec. Výstup můžete vidět takto:
+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
| 21.78 | 80.20 | 100.00 | 100.00 |
+---------------+---------------+---------------+----------------+
To vám říká, že 80 % vašich řetězců má méně než 20 znaků a všechny vaše řetězce mají méně než 50 znaků. Není tedy potřeba indexovat více než délku předpony 50 a rozhodně není potřeba indexovat celou délku 255 znaků.
PS:INT(1)
a INT(32)
datové typy ukazují na další nedorozumění ohledně MySQL. Číselný argument nemá žádný vliv na úložiště nebo rozsah hodnot povolených pro sloupec. INT
je vždy 4 bajty a vždy povoluje hodnoty od -2147483648 do 2147483647. Číselný argument se týká vyplnění hodnot během zobrazení, což nemá žádný účinek, pokud nepoužijete ZEROFILL
možnost.