Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/06917.jsonl.gz/11

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.