MYSQL(Amazon RDS)で複数テーブルの更新を実行しようとしていますが、非常に遅いです。MYSQL複数テーブルの更新が非常に遅い
私は何をしようとしていますか?
1時間の時間枠に基づいてすべての重複行を削除します。
以下、テーブル内の重複する行を識別する一時テーブルを作成しました。このクエリは2秒で実行されます。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
CREATE TEMPORARY TABLE tmpIds (id int primary key);
INSERT into tmpIds
SELECT distinct
d.id
FROM api d INNER JOIN api orig
on d.domain_id = orig.domain_id and d.user_id = orig.user_id
WHERE
orig.created_at < d.created_at
AND d.created_at <= DATE_ADD(orig.created_at, Interval 1 hour)
AND d.type = 'api/check-end'
AND d.created_at >= '2016-08-01';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED ;
問題は、本番サーバーで実行するのに長い時間かかるUPDATEクエリです。また、apiテーブルをロックします。 25万行句(タイプ後 - 全
SET @TRIGGER_DISABLED = 1;
UPDATE
api a,
tmpIds ti
SET
a.deleted_at = now()
WHERE
type = 'api/check-end' AND created_at >= '2016-08-01' AND a.domain_id < 10 AND a.id = ti.id;
SET @TRIGGER_DISABLED = 0;
STATS
- 一時テーブル:32,000行
- APIテーブル
SET @TRIGGER_DISABLED = 1; UPDATE api SET deleted_at = now() WHERE type = 'api/check-end' AND created_at >= '2016-08-01' AND id IN (SELECT id FROM tmpIds); SET @TRIGGER_DISABLED = 0;
Iはまた、このバージョンを試し、created_at) 200,000行。
- apiテーブルには高価なトリガーがあるため、これをオフにしたのは です。
- サンプルを1000回更新して6分間実行します。
- APIテーブル上のインデックスの主キー
説明を表示します。サブクエリをJOINに置き換えることができますが、一時テーブルをインデックス化できないという問題がある場合は、必要に応じて切り捨てることができる実際のテーブルを使用する方がよい場合があります。 – Mihai