2010-04-20 7 views
1

J'ai 2 tables: 1. nouvelles (450k lignes) 2. news_tags (3m lignes)2k lignes mise à jour est très lent dans MySQL

Il y a des déclencheurs sur la mise à jour de la table de nouvelles qui mise à jour des listes. Ce SQL s'exécute trop longtemps ...

UPDATE news 
SET news_category = some_number 
WHERE news_id IN (SELECT news_id 
        FROM news_tags 
        WHERE tag_id = some_number); #about 3k rows 

Comment puis-je le rendre plus rapide?

Merci à l'avance, S.

+0

Définir "lent" s'il vous plaît. Qu'est-ce qui est trop long? Comment le plan d'exécution ressemble-t-il? Des problèmes pour trouver les données à mettre à jour (tag_id non indexé), ou des problèmes dans l'exécution grâce à des déclencheurs lents peut-être morts? Etes-vous CPU ou IO lié? – TomTom

+0

Ceci est une mise à jour unique sur un db de production et cela prend plus de 5 minutes. Notre application Web renvoie une erreur 504 lors de l'exécution de la requête ... SELECT news_id FROM news OERE news_id IN (SELECT news_id FROM news_tags OERE tag_id = un_numbre) prend 1.04 secondes. Donc le problème est dans les déclencheurs mais je ne peux pas les désactiver. – sergeik

Répondre

0

Si cela est un vous trouverez la mise à jour d'une fois, il vaut mieux désactiver vos déclencheurs, exécutez la mise à jour, puis exécutez une déclaration qui exécute ce que vos déclencheurs font en vrac.

+0

Salut Robin, Oui, c'est une mise à jour unique MAIS je dois mettre à jour la production db. Il est donc impossible de désactiver les déclencheurs ... – sergeik

+0

Si vous désactivez les déclencheurs, exécutez votre mise à jour, puis activez les triggers dans une transaction, puis la table sera verrouillée et aucune autre requête ne pourra être exécutée. Cela suppose qu'il tourne alors assez vite pour que cela soit possible. –

+0

Nous avons décidé de mettre à jour seulement 40 lignes :) Merci pour votre aide. – sergeik