2016-11-12 7 views
0

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テーブル上のインデックスの主キー
+0

説明を表示します。サブクエリをJOINに置き換えることができますが、一時テーブルをインデックス化できないという問題がある場合は、必要に応じて切り捨てることができる実際のテーブルを使用する方がよい場合があります。 – Mihai

答えて

0

問題は、次の文がありました:

SET @TRIGGER_DISABLED = 1; 

は、トリガを無効にはなかったが。私はAPiテーブルのUPDATEトリガを削除しなければならず、UPDATEは1.3秒で実行されました。

クエリの実行中にトリガーを無効にする最適な方法についてのヘルプがありますか?

+0

トリガーが必要ない場合は、すべて一緒にドロップして、イベントスケジューラーを使用して、特定の時間間隔でトリガーされたものを実行するイベントを作成しますか?更新が発生したときにトリガーを必要としない場合は、重複した処理が含まれているように見えます。 –

+0

返信いただきありがとうございます。私たちはすべてのトリガーをストアドプロシージャに移動します。 – DropAcid

関連する問題