2016-04-18 9 views
0

別のテーブルのIDに基づいてテーブルを更新しようとしていますが、パフォーマンス上の問題があります。 table_to_updateに150,000行、table_to_get_dataに400,000行あります。IDに基づくMySQLアップデート遅い(150,000レコード)

表は、データを取得するために +----+-----------------+ | id | field_to_update | +----+-----------------+ | 1 | orange | | 2 | apple | | 3 | pear | | 1 | orange | +----+-----------------+

表を更新する +----+-----------------+ | id | field | +----+-----------------+ | 1 | orange | | 2 | apple | | 3 | pear | +----+-----------------+

だから私が試した3種類の方法:

方法1:

UPDATE table_to_update t1, table_to_get_data t2 
SET t1.field_to_update = t2.field 
WHERE t1.id = t2.id 

方法2:

UPDATE table_to_update 
JOIN table_to_get_data 
ON table_to_update.id = table_to_get_data.id 
SET table_to_update.field_to_update = table_to_get_data.field 

方法3:

UPDATE table_to_update 
LEFT JOIN table_to_get_data 
ON table_to_update.id = table_to_get_data.id 
SET table_to_update.field_to_update = table_to_get_data.field 

これまでのところ、方法3は、それが1000行を更新するのにかかる時間を計算し、しかし、最速のようです、それは全体の更新を完了するために私に12時間かかります表。テーブルを更新するより効率的な方法はありますか?

EDIT: 追加EXPLAIN表 EXPLAIN Table

+0

列のインデックスは正しく設定されていますか?また、 'EXPLAIN 'を実行して、クエリがどのように実行されるかを調べることもできます。 – Cyclonecode

+0

create table queryを表示し、それぞれの3つのSQLメソッドの前にExplainも実行します。 – Naruto

+0

クエリの説明を表示する –

答えて

0

あなたは、両方のテーブルから参加している列にインデックスを作成します。

これはあなたのために不思議に思うでしょう。

+0

私はインデックスを追加していませんが、 w3schools](http://www.w3schools.com/sql/sql_create_index.asp)では、インデックスは検索には最適ですが、更新に時間がかかります。 – azxdf

+0

私はそれに同意しない。 インデックスを追加して、自分で試してみてください。 ヘルプがない場合は、いつでもインデックスを削除できます。 – Priyanshu

+0

確かに、それを試してみましょう。ありがとう。 – azxdf

関連する問題