知りたいこと
SQLのバルクインサートは、PHPなどの実コード上で利用して良いのか?
この疑問に至った理由
どこかで聞いた記憶があるがそのソースが見つからず、「記憶違いかどうか」を確認したいので、
お知恵をお貸しいただけると嬉しいです。
記憶
バルクインサートはDBロックが掛かるので、実コードでは使わない方が良い
バルクインサートは高速ですが、DBロックが掛かるので、実コード上ではあまり使わないほうが良く、
遅くともinsert文を一つずつ実行していくほうが良い。
バルクインサートは、直接値を入れるときやバッチ処理で使う。
と、本か何かで知った記憶があります。
この記憶は間違いなのでしょうか?それとも正しいのでしょうか?
ご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
PHPということなので、MySQLと仮定して。
MySQLでINSERTのデッドロックに嵌る人を1人でも減らすために
MySQL(InnoDB)でのDeadLock調査
MySQLのトランザクション分離(ISOLATION)レベルが、REPEATABLE READ(デフォルトがREPEATABLE READ)では、ファントムリード回避のためにネクストキーロックによるインデックス挿入時のロックが発生する可能性があります。
ファントムリードが問題にならない作りなら、ISOLATIONレベルをREAD COMMITEDにすれば発生はしないようです。
投稿2018/12/27 02:56
編集2018/12/27 04:09総合スコア25300
0
単純なテーブルロックの話ではなく、デッドロックについてだと思います。
(バルクインサート デッドロックで検索すると、具体的な説明があると思います)
また、実処理(実サービス)上でInsertを発行する場合、基本的にトランザクション管理下で作業をすることになると思いますが、どういったエラーが発生した際にどこまでデータを反映するか、といったことは、とても関心の高い機能設計になると思います。
例えば、禁則文字が1レコード(の1カラム)だけ入っていたせいで、その他のレコードまですべてなかったことにするのか、それともエラーのあったレコードだけ登録するか、等。
例えばECサイトで複数の商品の入ったカートを購入遷移に移そうとするとき、1つの商品が在庫切れだからと「購入できません」となるとまずいので、在庫のある商品だけを購入遷移に流す、など。(普通はUI含めて回避する話ではありますが、いい例が思いつかなかったので。)
なので、どうしても使いたい理由がなければ使わない方がいいです。
そしてどうしても使いたい理由が私には思いつきません。
投稿2018/12/27 02:46
総合スコア5405
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/27 03:05
2018/12/27 04:07
2019/01/03 12:56
0
バルクインサートはDBロックが掛かるので、実コードでは使わない方が良い
インサートについては更新・削除よりも他の作業に対して影響がでにくいので
あまり気にしなくてよいでしょう。
バルクインサートが原因のDBロック(テーブルロック?)もないと思います
もちろんトランザクションにおいてrollbackする可能があるならあまり大量のデータを
やり取りするのは効率的ではないかもしれません
1データ毎の流し込みをすると1アクション毎にセッションの接続・開放が発生し
オーバーヘッドが大きいです。
大量データについては基本的にバルクインサートするのが妥当でしょう。
(適正な単位があるので環境によっては分割が必要)
投稿2018/12/27 02:34
総合スコア116468
0
実コードとはいってもあくまでDBにSQL文を届けるだけなので関係ないと思います。
要はPHPの処理を「formタグから送るか」、「Ajaxから実行するか」の違いと似たようなものかと。
フレームワークでバルクインサート用のTraitを作った という例もあるようですし。
処理時間が長くなったり、1つ1つ実行しているということはinsert文の数だけDBアクセスが発生していて
WebサーバーにもDBサーバーにも負荷がかかるのでそちらの方が問題としては大きいです。
投稿2018/12/27 02:22
編集2018/12/27 02:24総合スコア80875
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/27 02:31
2018/12/27 02:36
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/03 13:02
2019/01/03 14:00 編集
2019/01/06 02:40