Maison >base de données >tutoriel mysql >Comment résoudre l'erreur « Clé spécifiée trop longue ; la longueur maximale de la clé est de 1 000 octets » de MySQL ?

Comment résoudre l'erreur « Clé spécifiée trop longue ; la longueur maximale de la clé est de 1 000 octets » de MySQL ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-10 22:34:16557parcourir

How to Solve MySQL's

Erreur MySQL : "Clé spécifiée trop longue ; la longueur maximale de la clé est de 1 000 octets"

Problème :

Vous êtes rencontrer l'erreur "La clé spécifiée était trop longue ; la longueur maximale de la clé est de 1 000 octets" lors de la création d'une table MySQL avec un requête. Cette requête implique la création d'une table avec plusieurs colonnes et un index combiné sur certaines d'entre elles.

Explication :

Cette erreur se produit lorsque la longueur totale des colonnes indexées dépasse la longueur de clé maximale autorisée dans MySQL, qui est de 1 000 octets. Dans ce cas, la clé « index » s'étend sur quatre colonnes avec des types de données VARCHAR, chacune ayant une longueur maximale de 255 caractères.

Solution :

Comme mentionné dans la solution fournie, la cause première de cette erreur est la longueur excessive des colonnes indexées. Pour résoudre ce problème, il est recommandé d'utiliser des index de préfixes, dans lesquels seule une partie des données est indexée. Ceci est réalisé en spécifiant une longueur pour chaque colonne indexée lors de la définition de l'index. Par exemple :

...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...

Détermination de la longueur optimale du préfixe :

Pour déterminer la longueur de préfixe la plus appropriée pour chaque colonne, il est recommandé d'analyser la distribution des données. Vous pouvez utiliser une requête comme celle-ci :

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 fournira le pourcentage de lignes avec des chaînes inférieures ou égales à une certaine longueur. Sur la base de ces résultats, vous pouvez choisir une longueur de préfixe qui couvre une partie importante des données sans gaspiller d'espace excessif. Par exemple, si 80 % des chaînes comportent moins de 20 caractères, une longueur de préfixe de 50 peut être suffisante.

Remarque supplémentaire :

Il est également important de notez que les types de données INT(1) et INT(32) utilisés dans la requête d'origine n'ont aucun impact sur le stockage ou la plage de valeurs. INT est toujours un type entier de 32 bits autorisant des valeurs comprises entre -2 147 483 648 et 2 147 483 647. L'argument numérique dans ces cas affecte principalement le remplissage de l'affichage et n'a aucun effet sur le stockage sous-jacent.

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!

Déclaration:
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