Как говорит @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
.