Mise à jour d'une table MySQL avec des valeurs de l'autre
Je suis en train de mettre à jour une table MySQL basé sur les informations de l'autre.
Mon original
tableau ressemble à:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
Et la tobeupdated
tableau ressemble à:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Je veux mettre à jour id
dans tobeupdated
avec le id
de original
basé sur value
(les chaînes stockées dans VARCHAR(32)
champ).
La mise à jour de la table de sera je l'espère ressembler à:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
J'ai une requête qui fonctionne, mais c'est très lent:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
Ce maxes mon CPU et conduit finalement à un délai d'attente avec seulement une fraction de la mise à jour (il y a plusieurs milliers de valeurs de la fonction en cours). Je sais correspondance par value
sera lente, mais c'est les seules données que j'ai à faire correspondre ensemble.
Est-il un meilleur moyen de mettre à jour des valeurs de ce type? Je pourrais créer une troisième table pour les résultats de la fusion, si ce serait plus rapide?
J'ai essayé MySQL - Comment puis-je mettre à jour une table avec les valeurs d'une autre table?, mais il n'a pas vraiment aider. Des idées?
Merci par avance pour votre aide une base de données MySQL débutant!
- Est-ce que votre "valeur" de la colonne ont un indice?
- Salut noodl; non,
value
n'ont pas un indice pour le moment.
Vous devez vous connecter pour publier un commentaire.
Qui doit le faire, et vraiment c'est faire exactement ce qui est le vôtre. Cependant, je préfère "REJOINDRE" syntaxe des jointures plutôt que de multiples " OÙ " les conditions, je pense que c'est plus facile à lire
Comme pour l'exécution lente, quelle est la taille des tables? Vous devriez avoir des indices sur
tobeupdated.value
etoriginal.value
EDIT:
on peut aussi simplifier la requête
USING
est un raccourci lorsque les deux tables de jointure identique nommékey
commeid
. c'est à dire une équi-jointure - http://en.wikipedia.org/wiki/Join_(SQL)#Équi-jointureoriginal
est de 100 000 entrées ettobeupdated
+ de 10 000), j'ai donc pris votre et noodl de conseils à propos de l'index et de l'ensemble de la requête désormais se termine en moins d'une seconde. Je ne peux pas croire la différence!? Merci beaucoup pour votre aide; j'ai appris beaucoup de choses!inner join
de faire quoi que ce soit ici qu'une jointure ne le serait pas? (Je suis sur le point de lancer une requête similaire, mais les deux tables ont les mêmes colonnes.)Ça dépend ce qu'est une utilisation de ces tables, mais vous pourriez envisager de placer le déclencheur sur la table d'origine lors de l'insertion et de mise à jour. Lors de l'insertion ou de mise à jour, mise à jour de la seconde table en fonction d'un seul élément de la table d'origine. Ce sera plus rapide.