Comme le dit @Devart, la longueur totale de votre index est trop longue.
La réponse courte est que vous ne devriez de toute façon pas indexer des colonnes VARCHAR aussi longues, car l'index serait très volumineux et inefficace.
La meilleure pratique consiste à utiliser des index de préfixes vous n'indexez donc qu'une sous-chaîne de gauche des données. La plupart de vos données seront de toute façon beaucoup plus courtes que 255 caractères.
Vous pouvez déclarer une longueur de préfixe par colonne lorsque vous définissez l'index. Par exemple :
...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...
Mais quelle est la meilleure longueur de préfixe pour une colonne donnée ? Voici une méthode pour le savoir :
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`;
Il vous indique la proportion de lignes qui n'ont pas plus d'une longueur de chaîne donnée dans le menu_link
colonne. Vous pourriez voir une sortie comme celle-ci :
+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
| 21.78 | 80.20 | 100.00 | 100.00 |
+---------------+---------------+---------------+----------------+
Cela vous indique que 80 % de vos chaînes comportent moins de 20 caractères et que toutes vos chaînes comportent moins de 50 caractères. Il n'est donc pas nécessaire d'indexer plus qu'une longueur de préfixe de 50, et certainement pas besoin d'indexer la longueur totale de 255 caractères.
PS :Le INT(1)
et INT(32)
types de données indique un autre malentendu à propos de MySQL. L'argument numérique n'a aucun effet lié au stockage ou à la plage de valeurs autorisées pour la colonne. INT
est toujours de 4 octets et autorise toujours les valeurs comprises entre -2147483648 et 2147483647. L'argument numérique concerne le remplissage des valeurs lors de l'affichage, ce qui n'a aucun effet sauf si vous utilisez le ZEROFILL
option.