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

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

ただいまの
回答率

90.62%

  • MySQL

    5678questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqlで演算処理をさせるべきかAP側でやるべきか

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,698

imamoto_browser

score 1066

あくまで一般論としてお聞きしますが、mysqlで演算処理をさせるべきかAP側でやるべきかを伺いたいです。

mysql側で複雑な計算処理(特定の条件に符号するテストの平均点や偏差値などの計算処理)をさせるべきか否かです。

mysql側でさせると、クエリはjoinやlike句、IN句、where句の演算子、サブクエリなどで複雑化し、開発効率は落ちる気がするのですが、反面AP側で返ってくるデータがすっきりしていてAP側の処理が簡潔に済むかなと思うのですが、みなさんは普段どのようなクエリを書いていますか。


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+5

実際に直面しているわけではない架空の状況であることと、架空の状況も具体的に考えられていない、極めて抽象的な質問なので回答も抽象的になりますが、「ケースバイケース」としかいえませんね。

初心者の方とのことなので、そういう質問になるのかもしれませんが、複数の方法が選べる場合は多くのケースでは、最適な方法は「こうすればいい」という単純な方法があるわけではない場合が多い、と言えます。なのでそれぞれのケースにおいて、経験・知識などから個別に判断するしかないでしょう。


少し具体的にいえば、データが1000万レコード以上、「社内向けもしくは個人向け」のシステムでは無く、不特定多数の人が使用するWebシステムならば、まずは「速いと思う方」で実装すべきです。

そして1000万件以上の大量のデータを投入しパフォーマンステストを行い、処理速度に問題があればDBをチューニングしたり、SQLで処理をしていたのならアプリケーションで処理をするようにさせてみたり、あるいはアプリケーションで処理をさせていたのならSQLで処理をするように変更したり、いろいろ試して速度差を比較し最適な方法を選択する、と言うようなアプローチになると思います。

逆に、社内もしくは個人で使用するシステムで、データも10万件以下の小規模システムなら、「どうだっていい」と思います。SQLが得意な人ならSQLで書けばいいし、SQLが苦手ならアプリケーションで書けばいい、と言うように、好き嫌い・得意不得意の要素で決めて問題ないと思います。


あとさらに言えば、どこで処理をするか変わる可能性があるとはじめからわかっているのなら、最終的な結果を返す関数・メソッドを作っておき、その関数・メソッドの中で実装の差を埋められるようにしておけば、他に影響せずにロジックの変更が行えます。

あと「特定の条件に符号するテストの平均点」は、私にとっては極めて単純な計算処理だし、それを行ってもSQLを複雑にせずに書けると思うので、特に悩まずSQLで処理してしまうことが多いと思います。偏差値になると若干複雑になるので、一旦SQLで書こうと試みて、複雑になるようであればアプリケーションで実装と言うことになると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/08 18:03

    長文で回答いただいておりますが、もう私の質問に回答しないでください。
    私はあなたの自慢話が聞きたいわけはないし、実際の案件の話を質問として採用できるわけないですよね?

    それに抽象的な質問だから抽象的な答えしかできないというのはおかしいと思います。あなたがこの質問のテーマを「どうだっていい」と思う以上に、私はあなたの回答を「どうだっていい」と思います。

    キャンセル

  • 2015/06/08 19:51

    imamoto_browser 様
    「一般論としてお聞きします」と聞いておいて、「抽象的な答えしかできないというのはおかしい」という意味が分からないです。
    『少し具体的にいえば、データが1000万レコード以上』、『 データも10万件以下の小規模システムなら』と、レコード数をあげて具体的に、どう選択すべきか述べられておられます。

    質問がどうだっていいとは一言もおっしゃっていません。『データも10万件以下の小規模システムなら、「どうだっていい」と思います。』という意見な訳ですよね。

    「実際の案件の話を質問として採用できるわけないですよね?」というのも、案件詳細は伏せつつ、できるだけ具体的に質問するかどうかは、質問者のスキルだと思いますよ。
    もちろん、一般論や抽象的な話に、具体的な話を混ぜて回答するのは、回答者の時間があるかと、スキルがあるかに依存するとは思います。

    皆さんの答えは、「ケースバイケース」で一致しています。

    おかしいのはどちらでしょうか??

    キャンセル

  • 2015/06/09 00:49

    takotakotさんやめて下さい。そういうことを伝えようとしても、どうせ彼の耳には届かないでしょうし。

    実際に問題に直面し困っているわけでもなく、架空の状況に対し抽象的な質問をしている時点で少しおかしな人だとうすうす感ずいていたのに、無視せずに回答してしまった私が悪いのです。

    キャンセル

+1

こんにちは。
開発効率というより、どこに負荷をかけて集中処理させるかを決めるのが良いのではないでしょうか。
また、それはアプリケーションの性能要件によるので一概に言えるものではないと思います。

MySQLで行えばDBサーバの負荷があがりますし、
Webシステムの場合はサーバAPで行えばWebサーバの負荷があがり、
クライアントAPで行えばクライアントの負荷があがります。

非力なクライアントであればサーバで行うべきかもしれませんし、一方私が以前行っていたプロジェクトではサーバでの負荷を下げるという方向性が既に決まっていたため、SQL上での複雑な演算は禁止されていました。
一概に言えるものではないのではないかと私は思っています。

ただ、本来こうするべきだよというガイドライン的なものはもしかしたら存在するかもしれませんね。
私も少し興味があります

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

処理の負荷はほとんどの場合、

    ソート >> 四則演算

となります。

JOINを避けてもDBサーバの負荷は下がらないどころか、負荷が上がります。
ただし、MySQLにないOLAP関数などの処理をサブクエリを使って無理に使ったりすると、MySQLはハッシュジョインがないため不要なループが発生して非効率になることがあります。

四則演算をするためのCPUリソースを使うことを嫌って、ソートまで行って、演算に必要な元データをAPサーバなどに転送するということは、

    転送中にキープされるメモリ
    ネットワークのリソース
    転送に必要なCPU(知れてますが……)

などを消費します。
APサーバで処理させるならば、「DBサーバでソートさせない」ぐらいでないとDBサーバの負荷は下がりません。

MySQLはOLAP関数がないのと、ハッシュジョインがないのとで、APサーバで処理した方がDBサーバの負荷が下がることはあります。
そもそも、OLAP関数を使わないと行けないような処理があるなら、MySQLを選択すべきではないでしょう。

ネットワークを通じてデータをコピーしてから処理するというのは、DBサーバ、APサーバ共に、大変なコストが掛かります。それを相殺できるほどDBサーバの負荷を下げることは、基本的には難しいです。

スケールアウトのためにJOINを避けるより、マスター類をコピーしてマルチフェーズコミットする方がマシです(ケースバイケースですけどね)。

「艦これ」から、ソーシャル系のサーバ構成を考える

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/08 15:06

    偏差値はOLAP関数(Window関数・分析関数)になるので、MySQLではちょっと面倒になります。
    MySQLでは標準偏差までしか出せませんから、そこから先を、APサーバで行うかは微妙なところです。
    OracleやSQLServerなら一発です。

    キャンセル

0

上の方々が意見されているとおり、ケースバイケースですが、
わたしの場合はソースの可読性が高いものを選びます。

しばらくたった後でも、自分で見てわかりやすいコード構成を心がけるのが一番と考えます。
後々のメンテナンスや、改良のことを考えて、です。

実際に速度云々に関しては、対処法は選択できますし、その場合は周辺の状況(スケールアウト、スケールアップなど)で変わってきます。
また、実際のところボトルネックがどこにあるのかはベンチを取るのが一番間違いない(想定されている対処法がベストとは限らない)のですから。

APサーバー側の言語もわかりませんしね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    5678questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。