MySQLテーブルを別のMySQLテーブルの値で更新する


93

あるMySQLテーブルを別のテーブルからの情報に基づいて更新しようとしています。

私のoriginalテーブルは次のようになります:

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

そして、tobeupdatedテーブルは次のようになります。

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

私は更新するidtobeupdatedしてidからoriginalに基づくvalue(に保存された文字列VARCHAR(32)フィールド)。

更新されたテーブルは次のようになります。

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

機能するクエリがありますが、非常に低速です。

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

これは私のCPUを使い果たし、最終的には実行される更新の一部のみでタイムアウトにつながります(一致する数千の値があります)。私は照合valueが遅いことを知っていますが、これらを一緒に照合しなければならない唯一のデータです。

このような値を更新するより良い方法はありますか?マージされた結果用の3番目のテーブルを作成することができますか?

MySQLを試しました-別のテーブルの値でテーブルを更新するにはどうすればよいですか?、しかしそれは本当に助けにはならなかった。何か案は?

MySQLの初心者を支援してくれてありがとう!


2
「値」列にインデックスがありますか?
noodl

こんにちはnoodl; いいえ、value現時点でインデックスはありません。
スーパーエンジェル

回答:


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

それはそれでうまくいくはずであり、実際にあなたのことを正確に行っています。ただし、複数の「WHERE」条件ではなく、結合には「JOIN」構文を使用する方が読みやすいと思います。

実行速度が遅い場合、テーブルのサイズはどれくらいですか?あなたは上のインデックスを持つ必要がありますtobeupdated.valueし、original.value

編集:クエリを簡略化することもできます

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

USINGある速記の両方のテーブルには、名前の同じ持って参加するときkeyなどにid。つまり、等結合-http://en.wikipedia.org/wiki/Join_( SQL)#Equi-join


3
ワイヤードありがとう!これは完全に機能します。テーブルは非常に大きい(original100,000以上のエントリとtobeupdated10,000以上)ので、インデックスに関するnoodlのアドバイスを取り入れ、クエリ全体が1秒未満で終了しました。違いが信じられない!?ご協力ありがとうございます。たくさん学びました!
スーパーエンジェル2011

5
聞いてよかった:)私もここで多くを学びます。多くの異なる問題やアイデアにさらされる可能性があるため、私はこのサイトが本当に好きです
Wired00

ありがとう..私はstackoverflowから非常に多くのことを試みました..これはついにうまく
いき

WHEREを使用した単純なUPDATEは、JOIN構文よりもはるかに高速であることを述べたかっただけです。約10.000行。
Alex2php 2017

1
彼らの主要な要素はもちろんインデックスとして割り当てることです。300Kレコードをタイムアウトなしで4秒で更新する必要がありました。
Amjo

0

これらのテーブルの用途は何であるかによって異なりますが、挿入および更新時に元のテーブルにトリガーを置くことを検討する場合があります。挿入または更新が完了したら、元のテーブルの1つのアイテムのみに基づいて2番目のテーブルを更新します。それはより速くなります。


firegnomに感謝します。私はこれまでトリガーを使用したことがありませんが、トリガーについては必ず読んでください。
スーパーエンジェル2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.