あくまで一般論としてお聞きしますが、mysqlで演算処理をさせるべきかAP側でやるべきかを伺いたいです。
mysql側で複雑な計算処理(特定の条件に符号するテストの平均点や偏差値などの計算処理)をさせるべきか否かです。
mysql側でさせると、クエリはjoinやlike句、IN句、where句の演算子、サブクエリなどで複雑化し、開発効率は落ちる気がするのですが、反面AP側で返ってくるデータがすっきりしていてAP側の処理が簡潔に済むかなと思うのですが、みなさんは普段どのようなクエリを書いていますか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
実際に直面しているわけではない架空の状況であることと、架空の状況も具体的に考えられていない、極めて抽象的な質問なので回答も抽象的になりますが、「ケースバイケース」としかいえませんね。
初心者の方とのことなので、そういう質問になるのかもしれませんが、複数の方法が選べる場合は多くのケースでは、最適な方法は「こうすればいい」という単純な方法があるわけではない場合が多い、と言えます。なのでそれぞれのケースにおいて、経験・知識などから個別に判断するしかないでしょう。
少し具体的にいえば、データが1000万レコード以上、「社内向けもしくは個人向け」のシステムでは無く、不特定多数の人が使用するWebシステムならば、まずは「速いと思う方」で実装すべきです。
そして1000万件以上の大量のデータを投入しパフォーマンステストを行い、処理速度に問題があればDBをチューニングしたり、SQLで処理をしていたのならアプリケーションで処理をするようにさせてみたり、あるいはアプリケーションで処理をさせていたのならSQLで処理をするように変更したり、いろいろ試して速度差を比較し最適な方法を選択する、と言うようなアプローチになると思います。
逆に、社内もしくは個人で使用するシステムで、データも10万件以下の小規模システムなら、「どうだっていい」と思います。SQLが得意な人ならSQLで書けばいいし、SQLが苦手ならアプリケーションで書けばいい、と言うように、好き嫌い・得意不得意の要素で決めて問題ないと思います。
あとさらに言えば、どこで処理をするか変わる可能性があるとはじめからわかっているのなら、最終的な結果を返す関数・メソッドを作っておき、その関数・メソッドの中で実装の差を埋められるようにしておけば、他に影響せずにロジックの変更が行えます。
あと「特定の条件に符号するテストの平均点」は、私にとっては極めて単純な計算処理だし、それを行ってもSQLを複雑にせずに書けると思うので、特に悩まずSQLで処理してしまうことが多いと思います。偏差値になると若干複雑になるので、一旦SQLで書こうと試みて、複雑になるようであればアプリケーションで実装と言うことになると思います。
投稿2015/06/08 03:35
総合スコア902
0
処理の負荷はほとんどの場合、
ソート >> 四則演算
となります。
JOINを避けてもDBサーバの負荷は下がらないどころか、負荷が上がります。
ただし、MySQLにないOLAP関数などの処理をサブクエリを使って無理に使ったりすると、MySQLはハッシュジョインがないため不要なループが発生して非効率になることがあります。
四則演算をするためのCPUリソースを使うことを嫌って、ソートまで行って、演算に必要な元データをAPサーバなどに転送するということは、
転送中にキープされるメモリ ネットワークのリソース 転送に必要なCPU(知れてますが……)
などを消費します。
APサーバで処理させるならば、「DBサーバでソートさせない」ぐらいでないとDBサーバの負荷は下がりません。
MySQLはOLAP関数がないのと、ハッシュジョインがないのとで、APサーバで処理した方がDBサーバの負荷が下がることはあります。
そもそも、OLAP関数を使わないと行けないような処理があるなら、MySQLを選択すべきではないでしょう。
ネットワークを通じてデータをコピーしてから処理するというのは、DBサーバ、APサーバ共に、大変なコストが掛かります。それを相殺できるほどDBサーバの負荷を下げることは、基本的には難しいです。
スケールアウトのためにJOINを避けるより、マスター類をコピーしてマルチフェーズコミットする方がマシです(ケースバイケースですけどね)。
投稿2015/06/08 02:13
総合スコア295
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
開発効率というより、どこに負荷をかけて集中処理させるかを決めるのが良いのではないでしょうか。
また、それはアプリケーションの性能要件によるので一概に言えるものではないと思います。
MySQLで行えばDBサーバの負荷があがりますし、
Webシステムの場合はサーバAPで行えばWebサーバの負荷があがり、
クライアントAPで行えばクライアントの負荷があがります。
非力なクライアントであればサーバで行うべきかもしれませんし、一方私が以前行っていたプロジェクトではサーバでの負荷を下げるという方向性が既に決まっていたため、SQL上での複雑な演算は禁止されていました。
一概に言えるものではないのではないかと私は思っています。
ただ、本来こうするべきだよというガイドライン的なものはもしかしたら存在するかもしれませんね。
私も少し興味があります。
投稿2015/06/07 10:40
総合スコア4791
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
上の方々が意見されているとおり、ケースバイケースですが、
わたしの場合はソースの可読性が高いものを選びます。
しばらくたった後でも、自分で見てわかりやすいコード構成を心がけるのが一番と考えます。
後々のメンテナンスや、改良のことを考えて、です。
実際に速度云々に関しては、対処法は選択できますし、その場合は周辺の状況(スケールアウト、スケールアップなど)で変わってきます。
また、実際のところボトルネックがどこにあるのかはベンチを取るのが一番間違いない(想定されている対処法がベストとは限らない)のですから。
APサーバー側の言語もわかりませんしね。
投稿2015/06/08 03:50
総合スコア1901
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/08 09:03
2015/06/08 10:51
2015/06/08 15:49