2010-01-20 3 views
0

Existe-t-il un moyen d'exécuter des mises à jour de faible priorité dans MySQL, lors de l'utilisation d'InnoDB?Émettre des mises à jour de faible priorité

Je cours une application de charge très élevée où il peut facilement être littéralement des milliers d'utilisateurs essayant de mettre simultanément à jour les mêmes enregistrements de données. Il s'agit principalement d'informations statistiques basées sur des sessions, dont la plupart pourraient être ignorées au cas où il y aurait un temps d'attente associé à la requête. J'aimerais pouvoir vérifier si certaines tables/lignes sont verrouillées et, dans ce cas, ne pas transmettre une requête de mise à jour au serveur. Est-ce possible?

+0

@clops: J'ai remarqué dans les documents que UPDATE LOW_PRIORITY et ISERT DELAYED ne fonctionnent pas pour InnoDB, donc la réponse a été supprimée. – Veger

+0

Pas de problème du tout! Merci quand même! – clops

Répondre

0

Si vous dites qu'il ya une limite de temps à la demande, vous pouvez utiliser une procédure stockée pour sauter certaines mises à jour

Quelque chose comme ceci:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `updateStats` $$ 

CREATE PROCEDURE updateStats() 
BEGIN 

DECLARE _B smallint(1) DEFAULT 0; 
DECLARE _SECONDS INT DEFAULT 1; 

-- http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html 
SELECT GET_LOCK('myLabel1',_SECONDS) INTO _B; 
IF _B = 1 THEN 
    UPDATE table SET ........; 
    SLEEP(_SECONDS); 
    SELECT RELEASE_LOCK('myLabel1') INTO _B; 
END IF; 
END 

Cela fera en sorte que si vous avez le verrou, qui dure pour _SECONDS vous vous assurez qu'aucune autre procédure n'exécute le même code dans ce laps de temps. Le sommeil est nécessaire pour maintenir le verrou pendant 1 seconde (comme si le SP se termine plus tôt, le verrou est libéré)

Vous pouvez également ajouter un nœud else au cas, il la procédure stockée ne peut pas mettre à jour, à faire code personnalisé, comme ajouter à la file d'attente. Supposons que vous vouliez écrire dans la table en direct seulement dans l'intervalle de 1 seconde pour ne pas trop charger, probablement que vous avez beaucoup d'index dessus. Sur le noeud else, vous pouvez mettre à jour une deuxième table qui fait office de file d'attente et la file d'attente est vidée dans le noeud IF true, lorsque vous effectuez également la mise à jour.

1

avez-vous essayé de définir low_priority_updates=1 dans votre fichier my.cnf? Cela devrait donner la priorité aux requêtes sélectionnées lorsqu'une mise à jour ou une insertion verrouillerait autrement la table.

0

Ainsi, votre application utilisateur n'attend pas la fin de la mise à jour et s'en fout si elle ne se termine pas, est-ce que cela pourrait être un contexte approprié pour utiliser un gestionnaire de traitement en arrière-plan tel que Gearman?