Erreur MySql : "La clé spécifiée était trop longue"
Lors de l'interrogation des bases de données MySql, l'erreur "La clé spécifiée était trop longue" peut survenir lors de la création de tables avec de longues longueurs de clé. Ce problème se produit souvent lors de l'utilisation de plusieurs colonnes dans un seul index.
Étude de cas avec la table pds_core_menu_items
La requête fournie tente de créer une table avec un index composite sur le colonnes parent_menu_id, menu_link, plugin et alias. Ces colonnes sont des types de données VARCHAR(255).
Explication du problème
Comme @Devart l'a mentionné, la longueur combinée de ces colonnes dépasse la longueur de clé maximale autorisée de 1000 octets. En raison de cette restriction, la création de l'index échoue avec l'erreur spécifiée.
Solution : indexation par préfixe
La meilleure pratique pour résoudre ce problème consiste à utiliser l'indexation par préfixe. En utilisant des index de préfixe, seule une sous-chaîne gauche des données d'origine est indexée, ce qui réduit considérablement la taille de l'index et améliore l'efficacité.
Détermination de la longueur optimale du préfixe
Pour déterminer la longueur optimale du préfixe longueur de préfixe optimale pour chaque colonne, exécutez la requête suivante :
SELECT ROUND(SUM(LENGTH(`column_name`)<10)*100/COUNT(`column_name`),2) AS pct_length_10, ROUND(SUM(LENGTH(`column_name`)<20)*100/COUNT(`column_name`),2) AS pct_length_20, ROUND(SUM(LENGTH(`column_name`)<50)*100/COUNT(`column_name`),2) AS pct_length_50, ROUND(SUM(LENGTH(`column_name`)<100)*100/COUNT(`column_name`),2) AS pct_length_100 FROM `table_name`;
Remplacez column_name par la colonne en cours d'analyse et table_name par le tableau contenant la colonne. Analysez le résultat pour identifier la plus petite longueur de sous-chaîne qui couvre le pourcentage le plus élevé de lignes.
Requête mise à jour
Dans l'exemple fourni, l'indexation d'une sous-chaîne de 50 caractères suffirait , comme l'indiquent les résultats de la requête. Voici la requête mise à jour :
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
Remarque supplémentaire
L'erreur peut également se produire lors de l'utilisation des types de données INT(1) et INT(32). Bien que ces types de données n'aient aucun impact sur la taille de stockage ou la plage de valeurs, ils peuvent affecter la façon dont les valeurs sont affichées si l'option ZEROFILL est utilisée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!