Nous avons rencontré un problème après avoir déplacé la base de données de notre client vers un serveur supplémentaire. Cela aurait dû avoir des effets positifs sur les performances du site, mais il y a un problème avec le verrouillage des tables dans MyISAM. (J'ai entendu parler d'InnoDB au lieu de MyISAM, mais nous ne pouvons pas changer le moteur dans un avenir proche).
Nous pourrions le repérer dans une mise à jour-requête qui est effectuée lorsqu'un modérateur active un commentaire sur le site d'articles. Voici le processus:
- la requête de mise à jour est traitée
SET status = 1 WHERE id = 5
(l'index est défini) - les fichiers mis en cache de la page sont supprimés
À ce stade, la page entière devient lente. La base de données elle-même est occupée pendant quelques minutes. J'ai récupéré la liste de processus à plusieurs reprises et j'ai vu environ 60 entrées de différentes requêtes de sélection, qui étaient toutes en attente de verrouillage au niveau de la table .
1. Je ne comprends pas pourquoi cette mise à jour sur la table article_comments
peut affecter les instructions select pour que la table article
attende le verrouillage au niveau de la table. Dans processlist, presque toutes les requêtes en attente provenaient de cette table. J'ai lu que les mises à jour / insertions sont préférées aux sélections et que cela peut causer de tels problèmes, mais le tableau des articles lui-même n'est pas mis à jour lorsque les commentaires sont activés, donc les sélections ne doivent pas attendre. Ai-je mal compris cela?
2. Y a-t-il autre chose que le passage à InnoDB pour empêcher ce comportement ou au moins pour obtenir un meilleur équilibre? Je suis très irrité du fait que ce problème ne soit pas apparu avant de déplacer la base de données vers le nouveau serveur. Je suppose qu'il y a une mauvaise configuration mais je ne sais pas comment l'identifier.
key_buffer_size
était réglé sur 1GB
. Augmenter cela pour 10GB
réduire le problème.