1

これは、私がいる場所で常に頭に浮かぶテーマです。行のリストを返すタイプのクエリの場合、その特定の行に関するより多くの情報を収集する追加のクエリを実行したいことがよくあります。これには、行のリストを返すクエリが含まれることがよくあります。この例としては、顧客のリストを返す注文システムが挙げられます。各顧客の「行」には、注文のリストも (おそらくポップアップ ダイアログで) 表示される場合があります。

一般に、次のことは「より良い」ですか?

  1. 可能な場合は を使用して 1 つのクエリを実行GROUP_CONCATし、結果をプログラムで分割します (返される連結の長さには制限があります)。
  2. 「親クエリ」の結果をループしながら、各行に対して「子クエリ」を実行します
  3. 1 つの「親クエリ」を実行して顧客リストを返し、SQLINキーワードを使用して 1 つの「注文」クエリを実行して、前のクエリから返された customer_ID と一致させます。customer クエリの結果をループすると、orders クエリに customer_ID が存在するかどうかを確認し、一致する注文を表示できます。
  4. 2 番目のクエリを as and when に実行します。その理由は、親の結果ごとに子の結果を常に表示したいわけではないためです (Web アプリを使用すると、AJAX を使用して子の結果を取得できます)。
  5. 他の何か?

概念的には最もクリーンなソリューションのように見えるので、私は#2に傾いていますが、それはリソースを浪費していると思わざるを得ません。特定の一連の結果に対して独自のベンチマークを実行すると、#3 が最も早く出てきます。一部のアプリケーションはすべての結果を表示する必要がないため、#4 が最も高速であるように思われますが、その意図は、その行の子データを取得するための別のラウンドトリップではなく、結果を準備して待機させることである可能性があります。などのメカニズムがどのように機能するかは完全にはわかりませんFETCH_ASSOCが、推奨事項は大歓迎です!

4

1 に答える 1

2

#3の方がいいと思います。すべての顧客を取得してから、この顧客のすべての注文のリスト (customer_ID IN (...)) を取得し、必要に応じて PHP 側で正しい顧客に注文をディスパッチすることをお勧めします。

このようにして、すべての情報を含む 2 つのクエリのみを取得し、ディスパッチ部分を回避できます (このクエリの後に行うロジックによって異なります)。

クエリのほとんどのオーバーヘッドはクエリ自体 (クエリを転送してからデータを取得する) に起因することに注意してください。データベースは検索や結合などに対して高度に最適化されているため、データの選択は (非常に高い数値に達するまで) ボトルネックにはなりません。解決。

さらに、IN を使用してインデックスで選択している場合、データベースは用語を検索する必要さえありません。インデックスを参照するだけで、各行に直接移動します。

アプリケーションにもよりますが、ユーザーが表示される 100 人の顧客の注文リストを 1 つまたは 2 つだけ見る場合は、#4 の方が適しています。

とにかく、SQLクエリをループで作成することは、一般的に悪い習慣/悪い設計/悪いロジックであることを考慮してください。

于 2013-06-07T13:41:57.697 に答える