• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DB参照&登録処理、どっちが高速?)

DB参照&登録処理、どっちが高速?

このQ&Aのポイント
  • 30日分の売り上げを登録するシステムをつくっています。登録先はDBで、日付を主キーとして1レコードずつ増えていく感じですが、既に登録があるものについてはレコード有無の判断をして上書きにする必要があります。
  • 処理を考えたところ、2パターンのどちらが高速か負荷が少ないのかで迷っており、助言をいただきたいと思い投稿しました。
  • <1>はDB参照が一度で終わるので高速かなと思うのですが、参照結果を一度格納し、再度1つづつを比較として引っ張ってくるためあまり効率が良くないのかと悩んでいます。アドバイスお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#87667
noname#87667
回答No.2

補足内容を見て、なんとなくイメージはつかめました。確かに、<1>の場合は2回selectをかけるのに対し、<2>の場合はselectは1回で済みますからね。 ただ、<2>の場合、「登録しようとする日の日付をキーにDBに同一日での登録がないか参照」する必要はない気がします。直接その日付でinsert処理を行い、エラーが返ってきたら、すでに登録済みということでupdate処理を行う、というロジックでもよいのではないでしょうか。 ちなみに、このシステム自体についての質問なのですが、1日に何度も処理を行うシステムなのでしょうか。もし1日に1回と決まっているなら、もっとシンプルになると思いますし、1日に複数個のデータを入れるような処理なら集計処理の追加を検討するなど、システムそのものの設計を見直した方がよいかもしれません。余計なお世話ですが、念のため・・・

noname#102084
質問者

お礼

再度のご回答ありがとうございます。 >直接その日付でinsert処理を行い、エラーが返ってきたら、すでに登録済みということでupdate処理を行う これが一番シンプルだと思いましたのでこの方法でやってみます! >システム自体 アドバイスありがとうございます。 厳密には1日1回の登録のみなのですが、システムを使っていない今現在においても一回報告した後に修正が複数回きたり、数日分まとめて報告などという状況があるので、締め日までの間は自由に修正できるようにできた方がいいかと思ってこんなややこしい仕組みになりました。 1日の売上高なので1回でいいはずなんですけど・・・(汗) 集計処理は、個人的に使うのに便利そうですので、ぜひ取り入れさせていただこうと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#87667
noname#87667
回答No.1

どちらにしても「30日分繰り返す」のであれば、DB操作の観点からすると、ほとんど変わらないような気がします。 個人的には<2>がよいと思います。for文で30回回して、検索対象の日付のデータの有無(mysql_fetch_arrayの結果で判定)によりinsertかupdateかを決める形でしょうか(insert用、update用関数は別途用意しておいた方が楽です)。 # というより、<1>の(2)の処理の意味がよく理解できないのですが・・・

noname#102084
質問者

補足

回答ありがとうございます。質問を略しすぎて重要な部分がぬけていました;申し訳ありません。 <1>と<2>は参照の方法が違います。 <1>は一度のselectで全レコードを取得して配列に格納し、その後PHP側で登録日と重複がないか確認します。 <2>は登録日をキーに30回か31回selectします。 <1> (1)DB接続 (2)既に登録されている日付を把握するため、全レコードの日付を取得 (3)登録しようとしている1日目の日付とDBから取得した日付を全て照合し、同一があれば上書き(update)、なければ登録(insert)でSQLを作成。 (これを30日分繰り返し、SQLを作成する) (4)SQL実行 (5)DB切断 <2> (1)DB接続 (2)登録しようとする日の日付をキーにDBに同一日での登録がないか参照(select)し、同一があれば上書き(update)、なければ登録(insert)でSQLを作成する。 (これを30日分繰り返し、SQLを作成する) (3)SQL実行 (4)DB切断

すると、全ての回答が全文表示されます。

関連するQ&A