2010-12-16 161 views
5

Question rapide. Parler à mon ami avec 25 ans d'expérience db il me disait si vous utilisez des contraintes de clé étrangère dans un db; Quand une table est écrite, par exemple, une table pour les messages, elle verrouillera la ligne relative sur la table parent pour, par exemple, les utilisateurs.Verrouillage de ligne dans MySQL InnoDb avec des contraintes de clé étrangère et des index appliqués?

Est-ce vrai?

En outre, il a dit que l'application d'index aux colonnes de clé étrangère devrait surmonter ce blocage, est-ce vrai?

Je suis préoccupé par le trafic de mon site Web qui est en croissance et je peux imaginer que ce soit un problème!

Merci!

+0

Je ne peux rien dire pour le verrouillage parent-table, mais je sais que l'indexation de vos colonnes de clés étrangères est une bonne idée. Surtout que vous utilisez probablement ces clés pour les jointures. Cela peut augmenter les performances de vos requêtes de plusieurs ordres de grandeur. – Stephen

+0

L'utilisation de jointures doit toujours être effectuée avec précaution (uniquement lorsque cela est nécessaire) dans le serveur de grappe, vous pouvez vous retrouver avec des analyses de table complètes qui vous font vraiment mal. – zanlok

Répondre

9

J'ai écrit un billet de blog sur ce point - http://www.mysqlperformanceblog.com/2010/09/20/instrumentation-and-the-cost-of-foreign-keys/ - la démo est tout comme votre ami décrit. Il y a un verrouillage sur les lignes parents!

Maintenant, pour la partie à expliquer la différence entre un « indice » et une « clé »:

  • Une clé est comme une propriété relationnelle de haut niveau. Cela correspond à cela.
  • Un index est un détail d'implémentation.

De l'MySQL manual, « InnoDB nécessite des index sur les clés et les clés étrangères référencées afin que les contrôles clés étrangers peuvent être rapide et ne nécessite pas une analyse de la table. ». Autrement dit, si vous n'ajoutez pas d'index lorsque vous ajoutez votre clé étrangère, InnoDB le fera automatiquement.

Aucune quantité d'indexation n'empêche le verrouillage parent décrit dans mon article de blog.

+0

Merci pour votre réponse détaillée –

+0

@ morgan-tocker les verrous pourraient-ils être atténués en créant des tables dont le seul but est de fournir une liste à jour des clés primaires pour lesquelles l'enfant a des FK? Par exemple: la table C a deux enfants (A & E). Mon idée est de créer deux tables à colonne unique (B & D) qui contiennent une clé étrangère à C (maintenue à jour avec les déclencheurs sur C). Si une clé étrangère A/E à B/D au lieu de C empêcherait-elle de pouvoir verrouiller l'autre mais conserver la valeur des contraintes de clé étrangère? – danielcraigie

+0

Le verrouillage peut être réduit avec la normalisation en général; puisque la plus petite granularité des verrous est au niveau de la rangée. –

-1
+0

Merci pour cela, je lisais cela plus tôt. Cela me donne une meilleure compréhension, mais ne répond pas directement à la question que je ne pense pas, étant donné que mon ami est un expert en DB, je voulais donc avoir une opinion personnelle sur la question ET s'il y avait une solution? –