

DBにデータを登録する際に使うINSERT文やUPDATE文は1つのSQLで複数のデータを登録する書き方がありますが、対象のデータ量が多い場合はSQLをどう作ると処理が速いのでしょうか？

私は1つのSQLで複数のデータをまとめて登録した方が速いのかなと思ったのですが友達は1つ1つSQL作る派らしくて、どっちが良いんだろうなぁと気になったので質問させていただきました。


CC BY-SA 4.0
2022-09-26T08:52:05.863
91311
2022-09-27T00:44:57.460
28635
question
mysql sql
大量のDBデータをより速く登録・更新するSQLの書き方について


（特にデータベースのコンテキストにおいては）「大量」という語は個人差が激しく、1MB、1GB、1TB等、具体的な量を明示しないことには意味がありません。

真に大量のデータを扱うのであれば、データベースエンジンが用意している専用の読み込み命令を使う必要があり、そのためには呼び出し側も事前にデータ加工することになるでしょう。例えばMySQLでは[`LOAD
DATA INFILE`構文](https://dev.mysql.com/doc/refman/5.6/ja/load-
data.html)があるようです。

* * *

> 私は1つのSQLで複数のデータをまとめて登録した方が速いのかなと思ったのですが友達は1つ1つSQL作る派

そこまでせず、簡易な高速化という意味であれば、当然一度にまとめた方が効率が良くなります。トランザクション数も減らせますし、メモリやディスクといったリソースの確保回数も削減されるためです。


CC BY-SA 4.0
2022-09-26T20:16:42.590
91316
2022-09-26T20:16:42.590
4236
91311
answer


公式のドキュメントに、下記のような記載があります。

[8.2.5.1 INSERT ステートメントの最適化](https://dev.mysql.com/doc/refman/8.0/ja/insert-
optimization.html)

> 行の挿入に必要な時間は、次の要因によって決まります。ここでの数はおよその割合を示しています。  
>  接続: (3)  
>  サーバーへのクエリーの送信: (2)  
>  クエリーの解析: (2)  
>  行の挿入: (1 ×行サイズ)  
>  インデックスの挿入: (1 ×インデックス数)  
>  クローズ: (1)

> 同じクライアントから同時に多数の行を挿入する場合は、複数の VALUES リストで INSERT ステートメントを使用して、同時に複数の行を挿入します。
> これは、個別の単一行の INSERT ステートメントを使用するより、大幅に (場合によっては数倍) 速くなります。
> 空ではないテーブルにデータを追加する場合は、データの挿入をさらに速くするために、bulk_insert_buffer_size 変数を調整できます。
> セクション5.1.8「サーバーシステム変数」を参照してください。

> テキストファイルからテーブルをロードする場合は、LOAD DATA を使用します。 通常、これは INSERT ステートメントを使用する場合より、20
> 倍速くなります。 セクション13.2.7「LOAD DATA ステートメント」を参照してください。

実運用だと、他にも気にする事は色々ありますが、下記の記事が参考になるかもしれません。

[データベースを遅くするための８つの方法](https://zenn.dev/koduki/articles/d3e8984f420b370681f9)

[ソーシャルゲームのためのデータベース設計](https://next.rikunabi.com/tech/contents/ts_report/img/201101/001861/dena_matsunobu.pdf)


CC BY-SA 4.0
2022-09-27T00:44:57.460
91320
2022-09-27T00:44:57.460
41943
91311
answer