web-dev-qa-db-fra.com

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

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

227
Dónal

Oui, mais seulement sur innodb . Innodb est actuellement le seul format de table livré dans lequel des clés étrangères sont implémentées.

198
Grant Limberg

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

InnoDB requiert des index sur les clés étrangères et les clés référencées afin que les vérifications de clé étrangère puissent être rapides et ne nécessitent pas d'analyse de table. Dans la table de référence, il doit exister un index dans lequel les colonnes de clé étrangère sont répertoriées en tant que premières colonnes du même ordre. Un tel index est créé automatiquement sur la table de référence s'il n'existe pas. (Contrairement à certaines versions antérieures, les index devaient créé explicitement ou la création de contraintes de clé étrangère échouerait.) nom_index, s'il est indiqué, est utilisé comme décrit précédemment.

Contraintes InnoDB et FOREIGN KEY

117
Mr Alexander
21
Robert Gamble

Vous n'obtenez pas automatiquement l'index si vous faites ALTER TABLE (au lieu de CREATE TABLE), du moins selon la documentation (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 à l'aide de ALTER TABLE, n'oubliez pas de créer d'abord les index requis.

11
Thomas Lundström

Comme indiqué, cela correspond à InnoDB. Au début, je pensais que c’était étrange que beaucoup d’autres (en particulier MS SQL et DB2) ne le fassent pas. Les analyses d'espace de table ne sont préférables aux analyses d'index que lorsqu'il y a très peu de lignes de table. Ainsi, dans la grande majorité des cas, une clé étrangère souhaite être indexée. Ensuite, cela me frappe - cela ne signifie pas nécessairement qu'il doit s'agir d'un index autonome (une colonne) - où il se trouve dans l'index FK Index automatique de MySQL. Donc, peut-être que c'est la raison pour laquelle MS SQL, DB2 (Oracle sur lequel je ne suis pas sûr), etc., laissent le soin au DBA; Après tout, plusieurs index sur des tables volumineuses peuvent causer des problèmes de performances et d’espace.

4
Wolf5370

Pour ceux qui recherchent une citation de 5.7docs :

MySQL requiert des index sur les clés étrangères et les clés référencées afin que les vérifications de clés étrangères puissent être rapides et ne nécessitent pas d'analyse de table. Dans la table de référence, il doit exister un index dans lequel les colonnes de clé étrangère sont répertoriées en tant que premières colonnes du même ordre. Un tel index est créé automatiquement sur la table de référence s'il n'existe pas. Cet index peut être supprimé silencieusement ultérieurement si vous créez un autre index pouvant être utilisé pour appliquer la contrainte de clé étrangère. nom_index, s'il est indiqué, est utilisé comme décrit précédemment.

4
Fahmi

Oui, Innodb fournit ceci. Vous pouvez mettre un nom de clé étrangère après FOREIGN KEY clause ou laissez-le laisser MySQL créer un nom pour vous. MySQL crée automatiquement un index avec le foreign_key_name Nom.

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
2
Navrattan Yadav