BackEnd

MySQLでバルクアップデート処理

投稿日:

はじめに

バッチ処理の実装では大量データを更新する場面がちょいちょい出てくると思います。
パフォーマンスを考えて出来る限りSQL発行回数を少なくして一括更新したい所です。
そんな時に使えるかもしれないバルクアップデート処理を紹介したいと思います。

使用するテーブル

テスト用に使用するテーブルです。

パターン数が少ないシンプルな更新

いつもやっている様なシンプルな更新処理で書けます。
例えば、テストの点数によって生徒のステータスを更新する場合、
パターンが一つしかない場合は、シンプルにwhereで条件付けて書けます

パターンが少数の場合は、case文で対応する事も可能です。

パターン数が多い場合

生徒の出席日数を更新したいと思います。
先程と異なり値の規則性がない為、whereやcaseで条件を付けるのは辛いものがあります。
その場合は、FIELD関数とELT関数の組み合わせで対応する事が可能です。

FIELD関数

第一引数のインデックスを返す関数。
下の例の場合、 ドイツ の文字列が文字リストの2番目にある為、2が返却されます。

詳細はこちら

ELT関数

引数から指定した番号の要素を返す関数。
下の例の場合、文字リストの1番目に当たる 日本 が返却されます。

詳細はこちら

組み合わせ

この2つを組み合わせて、student毎に出席日数をupdate出来ます。
where句で指定しているnameのインデックスをFIELD関数で取得し、それをELT関数の取得インデックスに利用しています。
結果的に、where句でname指定されている生徒の出席日数をそれぞれ指定された日数(10,20,30,40)に更新しています。
同様に、FILED関数の引数、ELT関数の引数、WHERE句に更新したい分の値を入れてやれば、一度のSQLでバルクアップデートが行う事が出来ます。

パフォーマンス

試しに1万レコードを一つずつアップデートする場合とバルクアップデートする場合で所要時間を比較してみたいと思います。
テストした際のコードは以下の通りです。
バルクアップデートする場合としない場合で、処理時間を計測してみました。

私のローカル環境ではバルクアップデートした場合0.5秒、1つずつアップデートした場合で20秒程度掛かっていました。
1万レコードでこれなので数が増えると結構な差が生まれそうです。

さいごに

関数の組み合わせで複数レコードを一括更新する方法を紹介しました。バッチ処理位しか使う場面はないと思いますが、機会があれば一度試してみてください。

おすすめ書籍

MySQL徹底入門 第4版 MySQL 8.0対応 達人に学ぶ SQL徹底指南書 SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

MySQLでFULL OUTER JOIN (完全外部結合)を行う

1 はじめに2 FULL OUTER JOIN とは3 MySQLでは4 CROSS JOIN5 さいごに6 おすすめ書籍 はじめに テーブル結合と言えば、INNER JOIN か LEFT OUTE ...

Stripe Connectを使って複合プランの継続課金を実装その2

1 はじめに2 追加プランの作成3 実装3.1 日割り金額の確認3.2 追加プランの契約4 さいごに5 おすすめ書籍 はじめに 前回の記事では、プラン(月額)とユーザ数分のID(従量課金)という2種類 ...

php logo

PHP入門 〜文字列と数値の操作〜

1 はじめに2 基本ルール2.1 開始と終了のタグ2.2 ホワイトスペース2.3 大文字と小文字の区別2.4 コメント2.5 変数の定義3 文字列の操作3.1 文字列の定義3.2 無駄なスペースを削除 ...

laravel logo

Laravelのバリデーションtips

1 はじめに2 配列のバリデーションでRule::uniqueを使う時のカラム名を指定したい3 配列バリデーションのエラーメッセージ制御4 カスタムバリデーションで、他の属性名を参照したい5 番外:複 ...

Go言語

Go 1.23 で追加された iter パッケージを使ってみる

1 はじめに1.1 iteratorとは2 push方式のイテレータ2.1 kとvを受け取るイテレータ関数2.2 イテレータ関数をチェインさせる2.3 イテレータ関数の型を利用する2.4 イテレーショ ...

フォロー

blog-page_side_responsive

2022年11月
 12345
6789101112
13141516171819
20212223242526
27282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。