質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

6回答

1979閲覧

ループを使用して1度に大量のSQLの実行は問題でしょうか?

colt

総合スコア45

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

1グッド

1クリップ

投稿2018/12/13 19:48

前提・実現したいこと

PHP7とMariaDBを使用してWEBアプリを開発しています。
その中で、約10個ほどのSELECT/INSERT/UPDATEのSQLを数千ループ実行するのですが、
1度にまとめて実行することはDB的に問題無いでしょうか。または例えばループ10回ごとに、
0.1秒のsleepを挟む、等行った方がいいのでしょうか。

内容は以下の様な感じです.

[例]

PHP

1beginTransaction(); 2for($i = 0;$i < 3000;$i++) 3{ 4  select1(); 5  select2(); 6  insert1(); 7  update1(); 8  insert2(); 9  insert3(); 10  update2(); 11  update3(); 12} 13commit();

この処理は夜間にスケジュール実行する予定ですが、かなり高負荷をかけてしまって
DBサーバがダウンしてしまう事が心配です。

ASID👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

高付加といっても、夜間のこのプロセスだけが走っているのであれば問題ありません。
sleepを挟むよりも、夜間のうちに確実に終わらせる方が通常は優先度が高いと思います。

時々「休ませる」ことで解決されるのは、温度の問題くらいですが、これは一応は気にしたほうがよいでしようね。サーバーの放熱が適切にできているかということです。ただCPUが高温になるので「休ませる」というのは悪手で、放熱の問題自体を解決すべきかと思います。

外部から呼び出すSQL文の数が多いために非効率になるということはありえます。たとえば、ストアドプロシジャにまとめるなどの方法はとれませんか?

投稿2018/12/13 22:40

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

colt

2018/12/14 04:55

ありがとうございます。サーバはクラウドの為、 放熱などは適切に処理されているかと思います。 ただしプロセスはこの他にも走っており、それらでは同様にSQLを発行しています。 ストアドプロシージャの線で考えてみます。
guest

0

SQLの中ではinsertは負荷が高い作業になります
仕様上可能であればinsertはバルク処理を検討ください

投稿2018/12/14 00:26

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

colt

2018/12/14 04:51

ありがとうございます。残念ながらInsertするデータだけまとめておく と言うのが難しい状態です。
yambejp

2018/12/14 05:06

そうですか、insertを複数発行すると、一気に流し込むのだと 何十、何百倍スピードが違うことも多いです (1~2時間かかる処理が数秒でおわるとか) 運用方法については精査したほうがよいでしょう
guest

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

colt

2018/12/14 04:49

参考URLありがとうございます
guest

0

負荷という点では問題はないでしょうが、トランザクションの粒度が気になります。
サンプルですと全件を一つのトランザクションで処理していますが、それで問題はないのでしょうか。ある程度の回数で分割しても構わないものでしょうか。

※途中で失敗した場合に「そこまでの成功分は(ある程度)保証して、リカバリはその後ろから」とするのか、「とにかく全部やり直せるように元に戻す」のか、どちらが業務上適しているのかという話です

投稿2018/12/13 23:48

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

colt

2018/12/14 04:48

できれば途中で失敗した場合に再度実行するだけでいい様にしたい と考えて、全体を1つのトランザクションで囲みました。 トランザクションを分けて動かす方法も考慮してみます。ありがとうございます。
guest

0

高い負荷のSQLというのは単独SQLまたは並列実行された場合の話です。
単なるループ処理という事であれば、完了するまでに要する時間が長いという事になるでしょう。

ですのでどちらかというと、SQLの発行回数を減らす事を考えられた方が良いかと思います。

投稿2018/12/14 00:13

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

colt

2018/12/14 04:52

ありがとうございます。できる限り減らした結果、 どうしてもこれだけ必要、という状態でした。。。
sazi

2018/12/14 11:37 編集

ループ内でSQLを発行するような作りになっていませんか? その場合はループの元になっているSQLに含めるようにすれば、減らすことができます。 基本的にループ処理を前提とせず、段階的に処理するように考えるとループを無くすことができます。
guest

0

元々入っているデータ量とかindexの貼られかたとか頻度によりますが何回も実行するよりはSQL文をひたすら変数に詰め込んでおいて一度だけ実行する方が総合的な負荷は少ないと思います。

投稿2018/12/13 20:33

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/14 00:07

なんとなく、insert into select on DUPLICATE 文が思い浮かんだ
m.ts10806

2018/12/14 00:18

それもできたらなおよしですね。 select1()とかマジックナンバーついたメソッドが大量にある作りも気になりますけど・・ いずれにしても結構な作り直しが発生しますね
colt

2018/12/14 04:57

ありがとうございます。 select1()などはあくまで例であって、実際は全て違います。 selectで取得した値にphpで計算を行って、その結果をinsert、update したりと複雑に行っていたのでいたので、1つのsqlでは厳しい状態でした。
m.ts10806

2018/12/14 05:00

「1つのSQLにまとめる」ではなく「一度に全てのSQLを実行する」という意味の回答です。
m.ts10806

2018/12/14 05:03

とはいうものの、要件に合わないのは確かですね。 ただ、そのあたりの複雑さは要件としては質問に書いておいてもらえると的確な回答も可能になりますので、今後気を付けてみてください。
colt

2018/12/14 05:42

ありがとうございます。以後気を付けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問