2 votes

Les tables verrouillées de MySQL affectent-elles les vues associées ?

Donc, après avoir lu Performances en PDO / PHP / MySQL : transaction versus exécution directe En ce qui concerne les problèmes de performances, j'ai fait quelques recherches sur le verrouillage des tables dans MySQL.

Sur http://dev.mysql.com/doc/refman/5.0/en/table-locking.html

Le verrouillage des tables permet à de nombreuses sessions de lire une table en même temps, mais si une session veut écrire dans une table, elle doit d'abord obtenir le droit exclusif exclusif. Pendant la mise à jour, toutes les autres sessions qui veulent accéder à cette table particulière doivent attendre que le la mise à jour soit terminée.

Cette partie m'a particulièrement frappé parce que la plupart de nos requêtes seront des mises à jour plutôt que des insertions. Je me demandais si l'on créait une table appelée foo sur laquelle toutes les mises à jour/insertions étaient effectuées et ensuite une vue appelée foo_view (une copie de foo, ou peut-être foo et un lien de plusieurs autres tables plus foo) sur laquelle toutes les sélections se produisaient, ce problème de verrouillage se produirait-il encore ?

En d'autres termes, les requêtes SELECT sur foo_view devront-elles toujours attendre la fin d'une mise à jour sur foo ?

Une autre brève question posée par mon collègue. Cela affecte-t-il la mise en cache ? En d'autres termes, si le SELECT est mis en cache, est-ce qu'il ira chercher le cache et renverra les résultats, ou attendra-t-il d'abord la fin du verrouillage ?

3voto

RC. Points 15804

Votre vue subira le même verrouillage que les tables sous-jacentes.

Depuis la page de référence MySQL sur verrouillage :

MySQL accorde des verrous en écriture sur les tables comme comme suit :

  1. S'il n'y a pas de verrou sur la table, mettez un verrou d'écriture sur elle.
  2. Sinon, placez la demande de verrouillage dans la file d'attente de verrouillage en écriture.

MySQL accorde des verrous de lecture de table comme comme suit :

  1. S'il n'y a pas de verrou d'écriture sur la table, mettez un verrou de lecture sur elle.
  2. Sinon, la demande de verrouillage est placée dans la file d'attente de verrouillage en lecture.

Il convient de préciser que cela dépend du moteur de base de données que vous utilisez. MyISAM suivra les étapes ci-dessus et verrouillera la table entière (même si elle est divisée en plusieurs partitions) là où un moteur comme InnoDB fera le verrouillage au niveau des rangées à la place.

Si vous n'atteignez pas les repères de performance nécessaires avec MyISAM et que vous avez montré que votre goulot d'étranglement est l'attente des verrous de table via les mises à jour, je vous suggérerais de changer le moteur de stockage de votre table pour InnoDB.

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