21914


**やりたいこと**  
・MySQLのUPDATE  
・条件によって、更新カラムが異なる  
・1レコードのA,B,Cカラムを更新する場合と、条件によってはDも更新する場合がある

* * *

**質問1.最小限度のカラムを2回更新？ まとめて1回更新？**  
・条件に応じてA,B,Cカラム更新した後、条件によってはDも更新(つまり2回)すれば良い？  
・それとも、不要なレコードも含め、A,B,C,Dカラムをまとめて1回更新した方が良い？

・条件に応じて必要最小限の更新カラムを指定するイメージ

[code]

    if(){
      SQL文1 … 1レコードの内の幾つかのカラムを指定
    }elseif{
      SQL文2 … 上記で指定しなかった幾つかのカラムを指定
    }
    
[/code]

* * *

**質問2.MySQLへは極力アクセスしない方が良い？**  
・PHPでもMySQLでも出来る場合は、アプリ側で処理した方が良いのでしょうか？  
・どちらで実装すべきかいつも迷います


CC BY-SA 3.0
2016-02-09T15:20:49.943
21912
2016-02-10T02:38:27.037
7886
question
php mysql
条件分岐して必要最小限度のカラムを更新した方が良い？　それともまとめて一気に更新した方が良い？


一般論として、実行速度に重きをおくならば、以下の2点を重要視するのが好ましいです。

  * 発行するSQL文の数を少なくする
  * なるべく MySQL 側 (RDBMS側) で処理をする

よって質問1の回答は「まとめて1回更新した方が良い」になります。

そして質問2の回答は「MySQL側で処理したほうが良い」になります。

ただしこれらは一般論であって、その他の条件によっては、必ずしもそうとは言い切れないことに注意してください。また計測して決める、という大原則を覚えておくと良いかもしれません。


CC BY-SA 3.0
2016-02-09T16:38:49.023
21914
2016-02-09T16:38:49.023
208
21912
answer


質問１はソースコード管理ツールの commit 単位に似た話ですよね。  
絶対に同期しなきゃならない更新なら一括更新発行しかないですし  
ROLLBACK の必要性から更新単位を決めてもいいですよね。  
動作速度から決めるのはナンセンスです (より高性能なマシンを使えば済む話だったりします)

質問２は、無条件で「その処理が SQL でできるなら SQL でしろ」です。  
SQL ではどうしても困難な処理ならば PHP でしてもいいでしょうが、  
そういう処理がどれだけあるかは思いつきません。

現代的高速サーバに対して SQL を発行して不自然なほど時間がかかるとしたら  
SQL 文の実装が悪かったり、そもそもデータベースの設計が悪かったりすることがほとんどです。  
今現在、性能が出ていないのであれば実行計画を確認するなどやれることはいくつもあります。

２：８の法則なんて言葉もあります。  
既に速いところを更に高速化しても性能はまったく上がりません。  
チューンアップは、どこが遅いかを計測するところから始めましょう。


CC BY-SA 3.0
2016-02-10T01:35:31.437
21918
2016-02-10T01:35:31.437
8589
21912
answer


> 質問1.最小限度のカラムを2回更新？ まとめて1回更新？

具体的な条件とか更新内容がわからないと何とも言えないです。1回のクエリでは出来ない(かめんどくさい)処理なら2回に分けるしかありません。

> 質問2.MySQLへは極力アクセスしない方が良い？

検索負荷と結果セットの大きさを考える必要があります。巨大なデータセットを取得して  
プログラム側でフィルタするような手法は論外ですが、軽量のクエリを2回で済むものを1回にするために検索負荷が高く結果セットが巨大になるクエリにするのはナンセンスです。

例えば、

[code]

    SELECT * FROM order LEFT JOIN category USING (category_id)
    
[/code]

よりも、`order` `category`を別々に取得してプログラム側で連結した方が良い場合もあります。


CC BY-SA 3.0
2016-02-10T02:03:14.910
21919
2016-02-10T02:03:14.910
5793
21912
answer


> 質問1.最小限度のカラムを2回更新？ まとめて1回更新？

実行する条件にもよりますが、1回更新の方が原則速いと思います。  
しかし、

[code]

    if(){
      SQL文1 … 1レコードの内の幾つかのカラムを指定
    }elseif{
      SQL文2 … 上記で指定しなかった幾つかのカラムを指定
    }
    
[/code]

上記をSQLのif(case)で分岐するよりは良いと思います。

> 質問2.MySQLへは極力アクセスしない方が良い？

状況がよくわかりませんが、アクセスしないというのはどういうことを指すかによります。

> ・PHPでもMySQLでも出来る場合は、アプリ側で処理した方が良いのでしょうか？  
>  ・どちらで実装すべきかいつも迷います

「PHPからMYSQLへ接続する」という前提で話します。  
答えはどちらでもないです。  
極力アクセスしないほうがいい？という質問ですが、  
そもそもSQLを使う予定がないのに接続をするなんてことはないと思います。  
使う予定があるなら接続します。  
どのシーンにおいても共通の処理としてDB接続しておきたい、  
ということですか？そうであれば接続するときだけつなげるようにすべきです。


CC BY-SA 3.0
2016-02-10T02:38:27.037
21921
2016-02-10T02:38:27.037
14215
21912
answer