2009-08-17 7 views
2

MySQLテーブルにフィールドを追加しました。新しい列に別のテーブルの値を設定する必要があります。ここで私が実行したいクエリは次のとおりです。750k行のMySQL更新クエリを実行する

UPDATE  table1 t1 
SET   t1.user_id = 
         (
         SELECT t2.user_id 
         FROM  table2 t2 
         WHERE t2.usr_id = t1.usr_id 
         ) 

私は239Kの行でローカルにそのクエリを実行し、それは約10分かかりました。ライブ環境でそれを行う前に、私がやっていることがうまくいくか、つまり10分は妥当かどうか聞いてみたかったのです。または私は別の方法、PHPのループを行う必要がありますか?より良いクエリ?不足している情報の2つのかなり重要な部分がありますが

答えて

6

UPDATE JOINを使用してください。これにより、すべての血色の行に対してサブクエリを実行するのではなく、更新する固有のinner joinが提供されます。それはと多くの場合、となる傾向があります。

update table1 t1 
inner join table2 t2 on 
    t1.usr_id = t2.usr_id 
set t1.user_id = t2.user_id 

usr_idの各列にもインデックスがあることを確認してください。それは物事をかなりスピードアップします。

一致しない行があり、t1.user_id = nullに設定する場合は、inner joinの代わりにleft joinを実行する必要があります。既に列がnullの場合は、t2の値に更新する場合は、inner joinを使用する方が高速です。

私は後者のために、これはMySQLの構文だと言及する必要があります。他のRDBMSは、update joinのやり方が異なります。

+1

このクエリでは、同じ結果(つまり、不在行にNULLが入っています)を生成するにはLEFT JOINが必要です – Quassnoi

+0

wow! 100行 - 平均650msのクエリをテストしました。両方のテーブルのusr_idに作成された索引キーMUL 100行avg 7ms! – ed209

+0

@ ed209:少しの変更でどれくらいの影響を与えることができますか? – Eric

0

  1. 彼らはテーブルのどのようなタイプですか?
  2. どのようなインデックスが存在しますか?

table2は、最初の2つのカラムとしてuser_idusr_idが含まれており、table1user_idにインデックス化されたインデックスがある場合、それはその悪いことではないはずです。

0

t2.usr_idにはインデックスがありません。

このインデックスを作成してもう一度クエリを実行するか、@EricLEFT JOIN)を含む複数のテーブルUPDATEが提案されています。 MySQLNESTED LOOPS以外のJOIN方法を欠いているので、それは重要な指標ではないUPDATE構文だと

注意。

しかし、複数のテーブルUPDATEが読みやすくなります。

関連する問題