Question

Alors après avoir lu Performance en AOP / PHP / MySQL: transaction par rapport exécution directe en ce qui concerne les problèmes de performance que je pensais à je l'ai fait quelques recherches sur le verrouillage des tables dans MySQL.

http://dev.mysql.com/ doc / refman / 5.0 / fr / table locking.html

  

verrouillage de table permet à de nombreuses sessions de   lire une table en même temps,   mais si une session veut écrire un   table, il faut d'abord obtenir exclusif   accès. Au cours de la mise à jour, tous les autres   sessions qui veulent accéder à cette   table particulière doit attendre jusqu'à ce que le   mise à jour est fait.

Cette partie m'a particulièrement frappé parce que la plupart de nos requêtes seront mises à jour plutôt que des inserts. Je me demandais si l'on a créé une table foo sur laquelle toutes les mises à jour / insertions ont été réalisées et une vue appelée foo_view (Une copie de foo, ou peut-être foo et une liaison de plusieurs autres tables, plus foo) sur laquelle tous les sélections se sont produits, serait ce problème de verrouillage encore se produire?

C'est, sélectionnerait des requêtes sur foo_view doivent encore attendre une mise à jour pour terminer le foo?

Une autre brève question que mon collègue a demandé. Est-ce que cela affecte la mise en cache? C'est à dire. si le SELECT est mis en cache, il a frappé le cache et le retour des résultats, ou faut-il attendre que la serrure pour terminer premier?

Était-ce utile?

La solution

Votre point de vue connaîtra le même verrouillage que les tables sous-jacentes.

A partir de la page de référence MySQL sur verrouillage :

  

Subventions MySQL verrous d'écriture de table   suit:

     
      
  1. S'il n'y a pas de verrou sur la table, placez un verrou en écriture sur elle.
  2.   
  3. Dans le cas contraire, mettez la requête de verrouillage dans la file d'attente de verrouillage d'écriture.
  4.   
     

Subventions table MySQL lecture serrures   suit:

     
      
  1. S'il n'y a pas de verrou sur la table, placez un verrou de lecture sur elle.
  2.   
  3. Dans le cas contraire, mettez la requête de verrouillage dans la file d'attente de verrouillage de lecture.
  4.   

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

Si vous n'êtes pas d'atteindre les critères de performance nécessaires avec MyISAM et vous avez montré votre goulot d'étranglement est en attente sur les verrous de table via des mises à jour, je vous suggère de changer le moteur de stockage de votre table InnoDB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top