2009-09-21 8 views
0

J'ai un script qui se met à jour toutes les semaines. J'ai reçu un avertissement de mon hébergeur que j'ai surchargé le serveur avec le script. Le problème, j'ai compris, c'est que j'utilise trop de requêtes UPDATE (une pour chacun de mes 8000+ utilisateurs).Ajout de requêtes SQL de mise à jour

C'est un mauvais code, je sais. Donc maintenant je dois regrouper toutes les données dans une requête SQL et mettre à jour tout à la fois. J'espère que c'est ce qui va régler mon problème.

Une question rapide. Si j'ajouter ajouter purement UPDATE requêtes séparées par un point-virgule comme ceci:

UPDATE table SET something=3 WHERE id=8; UPDATE table SET something=6 WHERE id=9; 

Et puis mettre à jour la base de données avec un grand code SQL, par opposition à l'interrogation de la base de données pour chaque mise à jour, il sera plus rapide droite?

Est-ce la meilleure façon de regrouper les instructions UPDATE? Cela réduirait-il considérablement la charge du serveur?

+0

Avez-vous des procédures stockées à votre disposition? –

+1

pourquoi devez-vous faire une telle chose? Si vous pouvez expliquer le scénario, une meilleure solution pourrait apparaître. – shahkalpesh

+0

Je cours http://www.tweekly.fm. C'est un mashup qui envoie des tweets chaque semaine de last.fm. Donc chaque semaine, je mets à jour les données et envoie les tweets. Je stocke les noms de bande pour les pages d'utilisateurs. C'est pourquoi je dois mettre à jour les données de l'utilisateur chaque semaine. –

Répondre

0

Il améliorera l'E/S puisqu'il n'y a qu'un seul aller-retour, mais que la base de données "effort" sera la même.

1

Votre meilleur pari est de lot ces déclarations de votre « quelque chose » champ:

UPDATE table SET something=3 WHERE id IN (2,4,6,8) 
UPDATE table SET something=4 WHERE id IN (1,3,5,7) 

Bien sûr, il ne sait rien de vos besoins, il y a probablement une meilleure solution là-bas ...

+0

Non désolé. Cela ne marchera pas. Chaque utilisateur a des données uniques ... –

+0

Ensuite, vous devez faire des choses uniques avec, dans ce cas, vous avez besoin de requêtes uniques. Il est temps de sortir votre carte de crédit et d'appeler votre fournisseur d'hébergement! –

2

Faites un fichier délimité avec vos valeurs et utilisez votre équivalent de LOAD DATA INFILE de MySQL. Ce sera nettement plus rapide qu'une mise à jour.

LOAD DATA INFILE '/path/to/myfile' 
REPLACE INTO TABLE thetable(field1,field2, field3) 
//optional field and line delimiters 
; 
0

Une curiosité de SQL est que l'expression entière suivante (1 -ABS (signe (A - B))) = 1 si A == B et 0 sinon. Par commodité, appelons cette expression _eq (A, B). So

mettre à jour le jeu de table quelque chose = 3 * _eq (id, 8) + 6 * _eq (id, 9) où id dans (8,9);

fera ce que vous voulez avec une seule instruction de mise à jour.

Questions connexes