Gestion de l'erreur « La clé spécifiée était trop longue » pour la définition de l'index
Le message d'erreur « La clé spécifiée était trop longue ; la longueur maximale de la clé est 1000 octets" indique un problème avec la longueur de l'index défini pour une table. Cette erreur peut se produire même si la requête a fonctionné avec succès dans le passé, car elle peut être influencée par des facteurs tels que la version du serveur de base de données, le type d'index et les données de la colonne.
Dans la requête fournie :
CREATE TABLE IF NOT EXISTS `pds_core_menu_items` ( ... KEY `index` (`parent_menu_id`,`menu_link`,`plugin`,`alias`) ... )
L'index index est défini sur quatre colonnes : parent_menu_id, menu_link, plugin et alias. La longueur combinée de ces colonnes dépasse 1 000 octets, ce qui entraîne l'erreur.
Pour résoudre ce problème, il existe plusieurs approches :
1. Réduire la longueur de la colonne d'index :
Le moyen le plus simple de corriger l'erreur est de réduire la longueur des colonnes d'index. Cela peut être fait en utilisant des index de préfixe, où seule une partie des données de colonne est indexée. Par exemple :
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
Les index de préfixe sont recommandés car ils réduisent considérablement la taille de l'index tout en conservant des recherches efficaces.
2. Déterminer la longueur optimale du préfixe :
Pour déterminer la longueur optimale du préfixe pour chaque colonne, il est utile d'analyser la distribution des données à l'aide d'une requête telle que :
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`;
Cette requête fournit le pourcentage de lignes avec la valeur de colonne inférieure à une longueur spécifique. Sur la base de ces résultats, vous pouvez sélectionner la longueur de préfixe appropriée pour minimiser la taille de l'index tout en conservant de bonnes performances.
Considérations supplémentaires :
Il est important de noter que l'erreur peut également se produire si la longueur totale de l'index dépasse 1 000 octets, même si toutes les colonnes individuelles font moins de 1 000 octets. Par conséquent, lors de la définition d'index sur plusieurs colonnes, la longueur combinée doit être prise en compte.
De plus, les types de données INT(1) et INT(32) ne sont pas pertinents pour le problème de longueur d'index. Cependant, il convient de noter que l'argument numérique dans ces types de données n'affecte pas le stockage ou les plages de valeurs, mais plutôt le formatage lors de l'affichage.
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!