MySQLから送信されたデータを使用してPHPページを作成しています。
持っている方がいいですか
SELECT
4つのテーブル結合を含む1つのクエリ、またはSELECT
テーブル結合のない4つの小さなクエリ。IDから選択します
どちらが速く、各方法の長所/短所は何ですか?各テーブルから1行だけ必要です。
MySQLから送信されたデータを使用してPHPページを作成しています。
持っている方がいいですか
SELECT
4つのテーブル結合を含む1つのクエリ、またはSELECT
テーブル結合のない4つの小さなクエリ。IDから選択しますどちらが速く、各方法の長所/短所は何ですか?各テーブルから1行だけ必要です。
プロファイリングツールを実行する必要があるのは、それが多くのことに依存し、変化する可能性があるためですが、原則として、コンパイルされるクエリを減らし、データベースへのラウンドトリップを減らす方がよいでしょう。
where句とjoinon句を使用できるのと同様に、物事をフィルタリングするようにしてください。
しかし、正直なところ、データベースが実行できることと比べてそれほど大きな打撃を受けることはおそらくないので、通常は問題ではありません。したがって、最適化が仕様でない限り、時期尚早に実行して最も単純なことを実行するべきではありません。
一般に、SELECTステートメントは1つにすることをお勧めします。データベースを使用する主な理由の1つは、特にクエリ形式の場合、情報の処理が高速であることです。
このアプローチに何らかの欠点がある場合、1つの大きなSELECTステートメントでは実行できないいくつかの種類の分析があることです。RDBMSの純粋主義者は、これはデータベース設計の問題であると主張します。その場合、私の最初の提案に戻ります。
複数のクエリの代わりに JOIN を使用すると、データベースが最適化を適用できるようになります。また、必要のない行を取得する可能性もあり (INNER 結合を複数の選択に置き換えた場合)、アプリ サーバーとデータベース サーバー間のネットワーク トラフィックが増加します。それらが同じボックスにある場合でも、これは重要です。
DB からデータをフェッチした後にデータをどうするかによって異なる場合があります。4 つの結果をそれぞれ個別に使用する場合は、4 つの個別の SELECT ステートメントを使用する方が論理的で明確です。一方、テーブルなどに統一された行を作成するなど、すべてのデータを一緒に使用する場合は、単一の SELECT と JOIN を使用します。
私は PHP/MySQL の作業を少し行いましたが、大量の JOIN を含む巨大なテーブルに対するクエリであっても、スマート インデックスがあれば、データベースは最適化に優れていることがわかりました。したがって、パフォーマンスを真剣に考えている場合は、クエリの最適化とインデックス作成について読み始めてください。
結合を使用して1つのクエリを実行します。このように、サーバーを1回だけヒットする必要があります。また、テーブルがインデックスと結合されている場合は、高速である必要があります。
Oracle では、クエリ キャッシングを利用したいと思います。また、シーケンシャル処理で実行している小さなクエリが多数ある場合、最後のクエリが最初のクエリをキャッシュからプッシュした場合は最悪です...次のパスでループして最初のクエリを (明らかに異なるパラメーター値で) 再度実行するのにちょうど間に合います。
私たちは Java ストアド プロシージャを使用して XML 出力ファイルを作成していましたが、個々のクエリのラウンド トリップ時間が大幅に短縮されることがわかりました。できるだけ少ないクエリですべてのデータを取得し、必要に応じてそれらの値を XML DOM にプラグインする方がはるかに高速であることがわかりました。
唯一の欠点は、Java コードが少し洗練されていなかったことです。これは、データのフェッチがその使用法から離れているためです。しかし、大規模で複雑な XML ファイルを可能な限りゼロに近い時間で生成する必要があったため、速度を最適化する必要がありました。
ただし、マージ テーブルを扱うときは注意してください。私の経験では、ほとんどの状況では 1 つの結合で十分ですが、マージ テーブルが関係している場合、奇妙な状況に遭遇する可能性があります。