2017-10-27 5 views
-1

私はMySQLサーバ上で2つのテーブル内部結合クエリを実行していますが、それは非常に遅く、終了するのに3時間かかります。内部結合クエリはインデックス付きテーブルで非常に遅いですか?

UPDATE table_A ta 
    JOIN table_B tb 
    ON ta.field1= tb.field1 
    AND ta.field2 = tb.field2 
    SET ta.field2 = tb.field2, 
    ta.field3 = tb.field3 
WHERE tb.field5 = 'ABC' 

table_Aは table_Bは100,000行

どちらもTAがあり65万行があります。 field1、ta。 field2、tb。 field1、tb。 field2、tb field5はすべて索引付けされ、EXPLAIN結果に表示されます。

どのようにすれば、より速く走らせることができますか?このクエリの

+0

インデックスの作成SQLを追加します。おそらくインデックスが不正です。明らかにtb.field5にインデックスが必要です – Andrew

+0

インデックスを持つフィールドを更新しています。なぜあなたはそれを必要としますか? –

+0

私はこの質問をd​​ownvoteしませんでしたが、クエリ最適化のヘルプを依頼するときに、クエリの各テーブルに 'SHOW CREATE TABLE'の出力を含めて、データタイプ、インデックス、および制約を見ることができるようにしてください。 'EXPLAIN'の出力も含めます。 –

答えて

1

UPDATE `table_A` ta INNER JOIN 
     table_B tb 
     ON ta.`field1`= tb.`field1` AND ta.`field2` = tb.`field2` 
SET ta.`field2` = tb.`field2`, 
    ta.`field3` = tb.`field3` 
WHERE tb.`field5` = 'ABC'; 

field2を更新する必要が新しい値が(join条件に基づいて)古い値と同じであることを考えると、ありません。

これらの指標のアプローチの一つは、最高動作するはずです:

  • table_B(field1, field2, field5)
  • table_B(field5, field1, field2)、データの性質に依存して良い作品table_A(field1, field2)

を。ただし、各フィールドで個別のインデックスではなく、複合インデックスを使用することは非常に重要です。

+0

両方を試して見て..ありがとう! –

+0

なぜフィールド2を更新していますか? !?! – Strawberry

+0

@Strawberry。 。 。それは本当に良い質問です。 OPに尋ねる –