1

非常に長い時間がかかる結合を使用する update ステートメントがあります。以下で詳細を説明しますが、クエリは次のとおりです。

update quote_line
left join quote q on (q.id = quote_id and q.version = version )
set quote_serial_id = q.serial_id

バックストーリー: 継承した DB をクリーンアップしようとしています。次のスキーマを持つ 2 つのテーブルがあります (重要な列のみが表示されます)。

見積もり:

serial_id  bigint(20)  -- Unique key defined with 'serial'
id         bigint(20)  -- Id of quote.
version    smallint(6) -- Version of quote.

引用行:

id         bigint(20)  -- Unique key defined with 'serial'
quote_id   bigint(20)  -- Foreign key to quote.
version    smallint(6) -- Foreign key to quote.

quote.id はキーではありませんが、quote.id+quote.version はキーであることに注意してください。何らかの理由で、設計者は、serial_id の代わりに、quote_line の外部キーとして id+version を使用することにしました。ここでこれを具体的にするために、結合を行う必要がある方法は次のとおりです。

select q.id, q.version, q.serial_id
from quote q join quote_line l on q.id = l.quote_id and l.version = q.version

quote_line の FK を quote.serial_id を使用するように変更すると、次の更新ステートメントが得られます。

update quote_line
left join quote q on (q.id = quote_id and q.version = version )
set quote_serial_id = q.serial_id

このステートメントは、何時間も実行した後でもまだ完了していません。引用符でインデックスを作成しようとしましたが、改善はありませんでした。MySQL 5.5.14 を実行しているため、アップデートで Explain を実行できません。2 つのテーブルの行数は次のとおりです。

引用: 335517 quote_line: 247992

すべての引用符に quote_lines があるわけではないことがわかります (実際、ほとんどの引用符にはありません)。これをより速く実行する方法に関するヒントはありますか? 最終的にはこれを本番サーバーに複製する必要があり、何時間もかかるわけにはいきません。

ありがとう!

4

1 に答える 1

0

Paul と sceaj のコメントにあるように、LEFT 結合を使用していました。「LEFT」を削除すると、クエリは数秒で実行されました。助けてくれてありがとう!

于 2012-09-27T14:58:53.133 に答える