Fatal Error: Unexpected BLOG

主に自分用の備忘録として

【MySQL】UPDATE文→INSERT文で大幅スピードUP・・・

とあるバッチ処理で、50行毎にUPDATEするというものがあったんですが、あまりにも時間かかるので、いろいろ試してました。
ですが、あまり効果は得られず。

最後の手段的に以下のように処理自体を変更しました。

変更前

    UPDATE table SET 
        column1 = (CASE column2 WHEN value1 THEN value2 ELSE value1 END), 
        column2 = (CASE column2 WHEN value3 THEN value4 ELSE value1 END), 
        ...

変更後

    INSERT temp_table (column1, column2, ... columnN) 
    VALUES 
        (value1, value2, ... valueN),
        (value1, value2, ... valueN),
        ... 
        (value1, value2, ... valueN)
    ;
    
    UPDATE table AS T1 
    INNER JOIN temp_table AS T2 
    ON T1.column1 = T2.column1 
    SET (
        T1.column1 = T2.column1,
        T1.column2 = T2.column2,
        ...
        T1.columnN = T2.columnN)
    WHERE T1.column1 = T2.column1;

要するに、UPDATE文で直接更新をかけるという処理から、
まず一時テーブル的なものに全てINSERTしておき、後で本テーブルにINNER JOINしてUPDATEをかける、
という処理に変更したのです。

結果驚く程の速度アップ。
元々のUPDATE文の書き方が悪かったのか、DBのインデックスの張り方が悪いのか・・・。

あまり良い方法ではないのは分かっているのだけど、今のところ最も速い(以前の方法ではハッキリ言って致命的に遅かった)ので、とりあえずこれで行こうと思います・・・。

データベースの神様ごめんなさい・・・。