305 votes

MySQL indexe-t-il automatiquement les colonnes de clés étrangères ?

MySQL indexe-t-il automatiquement les colonnes de clés étrangères ?

271voto

Grant Limberg Points 7931

Oui, mais seulement sur innodb . Innodb est actuellement le seul format de table expédié qui a des clés étrangères implémentées.

1 votes

Avez-vous une raison de croire que MySQL autorisera un jour les clés étrangères sur des colonnes non indexées pour tout autre type de table ?

0 votes

Je ne peux vraiment pas répondre à cette question. Vous pouvez consulter les moteurs de stockage Maria et Falcon qui seront publiés dans MySQL 6.0 et voir s'ils prennent en charge les clés étrangères sur les colonnes non indexées.

1 votes

Apparemment, ce n'est pas le cas. J'ai une grande table (1 million d'enregistrements) et count(*) where fkey= ? prendrait 15 secondes. J'ai ajouté un index sur la colonne fkey, et les choses se passent maintenant en moins d'une seconde.

151voto

Apparemment, un index est créé automatiquement comme spécifié dans la section le lien que Robert a posté .

InnoDB nécessite des index sur les clés étrangères et les clés référencées afin que les vérifications des clés étrangères soient rapides et ne nécessitent pas de balayage de la table. Dans la table de référencement, il doit y avoir un index où les colonnes de la clé étrangère sont listées comme les premières colonnes dans le même ordre. Un tel index est créé automatiquement sur la table de référencement s'il n'existe pas. (Ceci est en contraste avec certaines versions plus anciennes, dans lesquelles les index devaient être créés explicitement ou la création de contraintes de clé étrangère échouait.) nom_index, s'il est donné, est utilisé comme décrit précédemment.

InnoDB et les contraintes FOREIGN KEY

24voto

Robert Gamble Points 41984

20 votes

Cette réponse est un excellent exemple de la raison pour laquelle une réponse ne devrait jamais consister uniquement en un lien vers une réponse possible. Pour l'instant, la page liée ne répond pas du tout à la question.

5 votes

Veuillez ajouter toutes les informations dans la réponse elle-même au lieu de poster uniquement un lien.

12voto

Thomas Lundström Points 1019

Vous n'obtenez pas l'index automatiquement si vous effectuez un ALTER TABLE (au lieu de CREATE TABLE), du moins d'après le manuel de l'utilisateur. les docs (le lien est pour 5.1 mais c'est la même chose pour 5.5) :

[...] Lorsque vous ajoutez une contrainte de clé étrangère à une table en utilisant ALTER TABLE, n'oubliez pas de créer d'abord les index requis.

4 votes

J'ai également essayé sur MySQL 5.6 et MariaDB 10 et ALTER TABLE a créé un index. Il est intéressant de noter que mysqlindexcheck a signalé cet index comme étant un "index redondant". J'ai essayé de le supprimer mais j'ai obtenu l'erreur suivante : "ERROR 1553 (HY000) : Cannot drop index 'index_name' : needed in a foreign key constraint". Donc, il n'est pas possible de supprimer cet index et de conserver la clé étrangère.

1 votes

Vous pouvez revoir votre réponse. MySQL toujours crée un index pour accélérer la vérification des clés étrangères s'il n'en existe pas déjà un . La documentation essaie de vous dire que la création d'index avant les contraintes de clé étrangère peut accélérer un peu les choses. Par exemple, un index de clé composite qui pourrait servir d'index pour les contrôles de clé étrangère pourrait être utilisé par InnoDB au lieu de générer automatiquement un index redondant.

11voto

Pour ceux qui cherchent un devis de 5.7 docs :

MySQL nécessite des index sur les clés étrangères et les clés référencées afin que les vérifications des clés étrangères soient rapides et ne nécessitent pas de balayage de la table. Dans la table table de référencement, il doit y avoir un index où les colonnes de la clé étrangère sont listées comme les premières colonnes dans le même ordre. Un tel index est créé automatiquement sur la table de référencement s'il n'existe pas. n'existe pas. Cet index peut être abandonné silencieusement plus tard, si vous créez un autre index qui peut être utilisé pour faire respecter la contrainte de clé étrangère. nom_de_l'index, s'il est donné, est utilisé comme décrit précédemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X