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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

5回答

6075閲覧

SQL サブクエリでまとめるのとクエリを何度も投げるのはどちらがいいのか

search_search

総合スコア187

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

2クリップ

投稿2016/06/26 11:26

編集2016/06/26 11:31

PHP/SQLを学習中です。今までORMを使っていましたが、少し不便なところが出始めたので、素のSQLも使い始めました。
質問なのですが、サブクエリでまとめるのとクエリを何度も投げるのはどちらがよいのですか?

PHPフレームワークとしてFuelPHPを使っているのですが、こちらのフレームワークのORMが生成したクエリを見ると、サブクエリを使ってひとつのクエリにまとめているようでした。しかし、そうしたクエリで取得される場合は、多くの場合重複が多く、無駄が多く見えてしまいます。

たとえば、ある特定のタグ(Tag)の情報と、そのタグに紐づいた投稿(Post)を全て取得したとき、
タグの情報は、取得された投稿内ですべて共通なのにもかかわらず、全ての結果レコードに重複して含まれてしまいます。

取得にかかるコストは、もしかしたら重複していようがなかろうが変わらないのかもしれませんが、なんとなく変な感じがしますし、メモリ効率も気になりますし、ORMを使わなかった場合、読みにくいコードになりそうな気がします。実際のところ、どうなのでしょうか?

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

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

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

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

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

guest

回答5

0

ベストアンサー

前提がなにもないので、この場合の答えは、「場合による」でしょう。
コストのことを気にするよりは、メンテナンス性を気にしたほうがいいような気がします。

パフォーマンスに問題が出た時にメンテナンス性の高いコードなら対応もしやすいはずです。

DBは、実行前にExplainという処理が入るはずですし、フレームワークを作る人も私達よりも優秀な開発者でしょう。

プログラマが下手にコードを最適化するよりもコンパイラに任せるほうが良いという話も聞きますし、
下手にそのようなコードを書くとかえって最適化の邪魔になるとかもね。

ただ、SQLは書く人によって数百倍の差がでることがあるという話もあるので、そのようなことを分かったうえでルールを突破するというのもありでしょう。

その時々に応じて最適な解を出せるのがスキルじゃないかなぁと思います。

投稿2016/06/26 12:18

Mr_Roboto

総合スコア2208

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

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

0

個人的にO/RマッパーはSQLに関する深い知識を持つ経験豊富な開発者が使うものだと考えています。
SQLを書かずにPHPでDB操作が可能な強みはありますが、内部では結局SQLを叩いてますしO/Rマッパーが賢くなければ「なぜそんなコストの高いクエリを...」と思うようなこともあります。つまり、チューニングが難しくなるのです。

DBのチューニングは他の回答者さんがおっしゃるように場合によります。
正規化をおこなったテーブル設計をしっかりすればスパゲッティクエリになるパターンは少なくなるでしょう。

投稿2016/06/27 02:02

romiogaku

総合スコア546

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

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

0

別の環境ですが過去に、数万件のレコードをいくつものテーブルとリンクさせて取得し、加工したものを別テーブルに書きだしていくという処理がありました。
ループで回して何度もクエリを投げるという処理を行った場合、数時間かかっていたところ、全てを1回のクエリで処理したところ数十秒で終わったという実績があります。
環境や時と場合によると思いますが、やはり何度もクエリを投げるのはコストがかかると思いますので、できるならばDBに処理を任せた方が良いと思います。

投稿2016/06/27 00:49

ttyp03

総合スコア16996

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

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

0

個人的に勝手な基準を述べます。
スピードが問題にならないなら、可読性の高い方法が良いので、テンポラリテーブルを使って順次的に処理する。
誤条件に気づきやすくなり、処理時間がかかる要点SQLも見つけやすくなります。

スピードを上げたいなら、とりあえず副問い合わせに機械的に書き換えてみる。
確実ではないですが、これだけで速くなることもあります。

それでも満足しないなら、SQLの実行順序をいろいろためしたり、テンポラリテーブルを作成しつつ、ジョインに使う項目にインデックスを付与する。
この場合は王道はないので試行錯誤を避けることはできないと覚悟しましょう。

投稿2016/08/30 21:00

km668

総合スコア65

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

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

0

場合によります。
ループの中でデータベースにいちいち接続して取得して切断していたらいつまでたっても終わりませんし、本当に不要なデータなら取得する段階で落としておくべきでしょう。

投稿2016/06/26 12:20

Zuishin

総合スコア28656

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問