Mettre à jour une table MySQL avec les valeurs d'une autre


93

J'essaie de mettre à jour une table MySQL en fonction des informations d'une autre.

Ma originaltable ressemble à:

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

Et le tobeupdatedtableau ressemble à:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

Je veux mettre à jour iddans tobeupdatedla idde originalbase sur value(chaînes stockées dans le VARCHAR(32)terrain).

Espérons que le tableau mis à jour ressemblera à:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

J'ai une requête qui fonctionne, mais elle est très lente:

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

Cela maximise mon processeur et conduit finalement à un délai d'expiration avec seulement une fraction des mises à jour effectuées (il y a plusieurs milliers de valeurs à faire correspondre). Je sais que la correspondance par valuesera lente, mais ce sont les seules données dont je dispose pour les faire correspondre.

Existe-t-il une meilleure façon de mettre à jour des valeurs comme celle-ci? Je pourrais créer une troisième table pour les résultats fusionnés, si ce serait plus rapide?

J'ai essayé MySQL - Comment puis-je mettre à jour une table avec des valeurs d'une autre table? , mais cela n'a pas vraiment aidé. Des idées?

Merci d'avance d'aider un novice MySQL!


2
Votre colonne «valeur» a-t-elle un index?
noodl

Salut noodl; non, valuen'a pas d'index pour le moment.
Superangel

Réponses:


210
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

Cela devrait le faire, et c'est vraiment ce qui vous appartient. Cependant, je préfère la syntaxe 'JOIN' pour les jointures plutôt que plusieurs conditions 'WHERE', je pense que c'est plus facile à lire

Quant à courir lentement, quelle est la taille des tables? Vous devriez avoir des index sur tobeupdated.valueetoriginal.value

EDIT: on peut aussi simplifier la requête

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USINGest un raccourci lorsque les deux tables d'une jointure ont un nom identique keytel que id. c'est-à-dire une équi-jointure - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join


3
Merci wired00! Cela fonctionne parfaitement. Les tables sont assez grandes ( originalplus de tobeupdated100000 entrées et plus de 10000), j'ai donc suivi vos conseils et ceux de noodl sur les index et l'ensemble de la requête se termine maintenant en moins d'une seconde. Je ne peux pas croire la différence!? Merci beaucoup pour votre aide; J'ai beaucoup appris!
Superangel

5
C'est super à entendre :) J'apprends beaucoup ici aussi. J'aime vraiment ce site car vous pouvez être exposé à de nombreux problèmes et idées
wired00

merci .. j'ai essayé tellement de choses de stackoverflow .. celui-ci a finalement fonctionné
Jaxx0rr

Je voulais juste mentionner qu'une simple UPDATE avec WHERE était beaucoup plus rapide que la syntaxe JOIN. Environ 10 000 lignes.
Alex2php

1
Leur ingrédient clé est bien sûr l'assignation comme index. m'a amené à mettre à jour les enregistrements 300K en 4 secondes, par opposition aux délais d'attente sans eux.
Amjo

0

Cela dépend de l'utilisation de ces tables, mais vous pouvez envisager de mettre un déclencheur sur la table d'origine lors de l'insertion et de la mise à jour. Lorsque l'insertion ou la mise à jour est terminée, mettez à jour la deuxième table en fonction d'un seul élément de la table d'origine. Ce sera plus rapide.


Merci firegnom; Je n'ai jamais utilisé de déclencheurs auparavant, mais je ne manquerai pas de les lire.
Superangel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.