Maison > base de données > tutoriel mysql > Pourquoi est-ce que j'obtiens l'erreur MySQL « La clé spécifiée était trop longue » ?

Pourquoi est-ce que j'obtiens l'erreur MySQL « La clé spécifiée était trop longue » ?

Susan Sarandon
Libérer: 2024-12-09 12:24:15
original
176 Les gens l'ont consulté

Why Am I Getting the MySQL Error

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`;
Copier après la connexion

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))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal