Както казва @Devart, общата дължина на вашия индекс е твърде дълга.
Краткият отговор е, че така или иначе не трябва да индексирате толкова дълги VARCHAR колони, защото индексът ще бъде много обемист и неефективен.
Най-добрата практика е да използвате префиксни индекси така че индексирате само ляв подниз от данните. Повечето от вашите данни така или иначе ще бъдат много по-къси от 255 знака.
Можете да декларирате дължина на префикса за колона, докато дефинирате индекса. Например:
...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...
Но каква е най-добрата дължина на префикса за дадена колона? Ето метод да разберете:
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`;
Той ви казва дела на редовете, които нямат повече от дадена дължина на низа в menu_link
колона. Може да видите изход като този:
+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
| 21.78 | 80.20 | 100.00 | 100.00 |
+---------------+---------------+---------------+----------------+
Това ви казва, че 80% от низовете ви са по-малко от 20 знака и всичките ви низове са по-малко от 50 знака. Така че няма нужда да индексирате повече от дължина на префикса от 50 и със сигурност няма нужда да индексирате цялата дължина от 255 знака.
PS:INT(1)
и INT(32)
типове данни показва друго недоразумение относно MySQL. Числовият аргумент няма ефект, свързан със съхранението или диапазона от стойности, разрешени за колоната. INT
винаги е 4 байта и винаги позволява стойности от -2147483648 до 2147483647. Числовият аргумент е за допълване на стойности по време на показване, което няма ефект, освен ако не използвате ZEROFILL
опция.