2012-01-02 6 views
12

J'ai un problème avec ma base de données actuelle avec mysql.ne peut pas mettre à jour l'enregistrement, se coincer

J'ai plus de 100 connexions en attente sur un enregistrement sélectionné. quand j'exécute:

show processlist; 

la requête select est une grande requête et les autres sont des requêtes et des insertions, des mises à jour.

J'ai une base de données avec 100 tables et la sélection utilise 5 jointures.

Y at-il un moyen d'arrêter temporairement le processus et de laisser les autres processus s'exécuter, une fois tous les processus terminés, alors la sélection peut continuer à fonctionner?

+1

EXPLIQUER votre requête, peut-être vous avez des problèmes d'index –

+0

Comment peut par exemple un INSERT attendre sur un SELECT? Je ne veux pas croire qu'un serveur SQL moderne bien configuré puisse afficher ce bogue ... –

+1

@ PéterVarga: dans 'MyISAM', les lectures peuvent bloquer les écritures (et vice versa). – Quassnoi

Répondre

12

Je vais recommander à la requête de faire ce qu'elle doit faire, si vous arrêtez ou si vous tuez des processus ou des requêtes, vous pourriez avoir des erreurs d'intégrité des données qui peuvent conduire à des erreurs majeures.

BookOfZeus et tfb785 ont raison, tout d'abord vous avez probablement des erreurs d'index. l'explication vous dira quel est exactement le problème et ce qu'il faut rechercher. Par exemple, si vous avez 5 jointures et que vous obtenez le nombre de lignes comme, 100 000 et 100 et 1 et 1 et 1, vous aurez plusieurs 100 000 * 100 qui peut être très lent.

lisez attentivement ce que l'explication vous dit et optimisez votre requête en fonction de celle-ci. Innodb peut être une bonne option si vous si les tables sont accédées très souvent parce que son verrouillage de ligne instaure de verrouillage de table pour myisam.

Je dirais d'abord essayer d'optimiser votre requête, peut-être vous n'aurez pas besoin de modifier votre moteur de table pour résoudre le problème. Si vous avez encore des problèmes, vous pouvez envisager de passer à innodb.

+0

laissez-moi vérifier ce que j'ai –

+0

oh f ** k vous avez raison j'ai: 1 314 145 sur 1 table, 1.292 sur une deuxième table, 11 sur une 3ème table et le reste sont 1. donc cela signifie 1.314.145 * 1292 * 11 * 1 * 1? –

+0

qui est votre problème, assurez-vous que les index sont bons et les clés sont (pk, clé et fk) sont configurés correctement –

4

Existe-t-il un moyen d'arrêter temporairement le processus et de laisser les autres processus s'exécuter, une fois tous les processus terminés, alors la sélection peut continuer à fonctionner?

Je crois que vous utilisez MyISAM comme moteur de stockage.

Dans MyISAM, les requêtes de lecture bloquent les requêtes d'écriture simultanées. Cela garantit que les écritures ne modifieront pas les données en cours et que la moitié de votre jeu d'enregistrements ne sera pas mise à jour et qu'une autre moitié ne sera pas mise à jour.

Il n'existe aucun moyen d'arrêter la requête SELECT comme vous le demandez: les écritures peuvent rendre le jeu d'enregistrements renvoyé incohérent. Bien que ce ne soit pas le cas dans votre configuration et que les écritures théoriques n'affectent peut-être pas les lectures (par exemple, différents enregistrements sont lus et écrits), MyISAM ne le sait pas et bloque toujours des tables entières, au cas où.

Si vous avez besoin d'écrire pour ne pas bloquer les lectures, passez à InnoDB (bien qu'il existe des cas où les écritures bloqueront aussi les lectures).

4

Vous ne pouvez pas arrêter la requête en cours d'exécution et donner l'heure aux autres requêtes. Mais il y a trois façons de résoudre votre problème:

Première façon: modifier le niveau d'isolement http://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html Ces peut également signifier que vous devez changer votre moteur de stockage par exemple. à InnoDB.

Deuxième moyen: Essayez d'accélérer votre longue course sélectionnez avec des indices. C'est ce qu'on appelle un compromis de mémoire de temps. Vous accélérez votre requête avec plus de mémoire pour tenir les arbres des index.

Troisième chemin: Accélérez votre longue course sélectionnez avec réorganiser la requête (jointures et sélectionne). Analysez le coût de toutes les parties de requête.

Questions connexes