非常に長い時間がかかる結合を使用する 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 があるわけではないことがわかります (実際、ほとんどの引用符にはありません)。これをより速く実行する方法に関するヒントはありますか? 最終的にはこれを本番サーバーに複製する必要があり、何時間もかかるわけにはいきません。
ありがとう!