Le système de verrouillage des tables de MySQL empêche les blocages.
MySQL utilise le verrouillage de table pour réaliser des verrous à très haute vitesse. Cela remplace avantageusement le verrouillage de colonne ou de ligne. Pour les grandes tables, le verrouillage est BEAUCOUP plus rapide que le verrouillage de ligne. Cependant, il y a quelques limitations.
Le verrouillage de table permet à plusieurs threads de lire une table en même temps, mais limite l'écriture de cette table à un seul thread, qui doit s'assurer de l'accès exclusif à la table. Durant la modification, les autres threads devront attendre.
Etant donné que les modifications sont considérés comme plus importantes que les SELECT
, toutes les commandes de modifications ont une priorité supérieure aux commandes de selections. Cela permet de ne pas bloquer les modifications si une table est sujette à un fort trafic en lecture.
Le problème principal avec ceci est décrit avec la situation suivante :
- Un client émet une requête
SELECT
qui prend un très long temps.
- Un autre client émet une requête
INSERT
sur la même table; ce client va devoir attendre que le premier a fini.
- Un autre client émet une autre requête
SELECT
sur la même table; Comme INSERT
a la priorité sur SELECT
, ce SELECT
va attendre que INSERT
soit fini. Il va aussi attendre que le premier SELECT
soit fini !
Les solutions envisageables sont :
- Essayer d'accélérer la commande
SELECT
; comme par exemple, en créant une table sommaire.
- Démarrer
mysqld
avec --low-priority-inserts
. Cela va donner aux commandes de sélection la priorité sur les commandes d'insertion. Dans ce cas, la dernière requête SELECT
du scénario passera en priorité sur la commande d'insertion.
- Vous pouvez donnez spécifiquement à une commande
INSERT
,UPDATE
ou DELETE
une priorité inférieure avec l'attribut LOW_PRIORITY
.
- Vous pouvez spécifiez que toutes les modifications d'un thread donnée auront une priorité basse, en utilisant la commande SQL : :
SET SQL_LOW_PRIORITY_UPDATES=1
. Reportez vous à la section SET OPTION
.
- Vous pouvez donnez spécifiquement à une commande
SELECT
une priorité supérieure avec l'attribut HIGH_PRIORITY
. Reportez vous à la section SELECT
.
- Si vous utilisez fréquemment des commandes
INSERT
et SELECT
, l'attribut DELAYED
de INSERT
pourra vous aider à résoudre votre problème. Reportez vous à la section INSERT
.
- Si vous avez des problèmes avec
SELECT
et DELETE
, l'option LIMIT
de DELETE
peut être utile. Reportez vous à la section DELETE
.