4

3 つのテーブルがあり、それぞれに共通の情報と、テーブルに固有の情報が含まれています。例:uiddateテーブル間で共通ですが、一方のテーブルには列が含まれ、typeもう一方のテーブルには が含まれる場合がありますcurrencydate DESCデータベースにクエリを実行し、 3 つのテーブルすべてに入力された最新の 20 エントリ ( ) を取得する必要があります。私のオプションは次のとおりです。

  1. 3 つの句を含む 1 つの大きなクエリでデータベースを 1 回クエリし、UNION ALL列 IE に偽の値を渡します。

    FROM    (
        SELECT  uid, date, currency, 0, 0, 0
    

    そして後で

    FROM    (
        SELECT  uid, date, 0, type, 0, 0
    

    これにより、null値のフィールドが割り当てられます..

  2. または、データベースに 3 回クエリを実行し、情報を介して PHP 内でsort最新の 20 件の投稿を結合して取得することもできます。これにより、過剰な情報 (60 件の投稿 ( LIMIT 20) * 3) が残され、毎回何らかの追加のクイックソートを実行する必要が生じます。

どのオプションがより良いか、代替案はありますか?

ありがとう。

4

3 に答える 3

6

これらの 2 つのオプションは、見た目よりも似ています。

sを使用して 1 つの大きなクエリを実行するとUNION、代替計画で提案したように、MySQL は 3 つの個別のクエリを実行し、それらを 1 つの結果に結合します。

そのため、MySQL にフィルタリング (およびLIMIT) を行わせるか、自分で行うことができます。その選択を考えると、MySQL にすべての作業を任せることがはるかに望ましいように思えます。

結果セットに余分な列があると、理論的にはパフォーマンスが低下する可能性がありますが、結果セットが 20 行と非常に小さいため、検出可能な影響はないと思います。

于 2009-08-11T12:36:36.917 に答える
0

制限がわかっている場合は、各クエリを制限し、ユニオンを小さなデータでのみ実行することができます。これは、mysql が 20 行のみを返し、PHP でできるよりもソートが高速になるため、より良いはずです...

select * from (
  SELECT  uid, date, currency, 0, 0, 0 from table_a order by date desc limit 20
  union
  SELECT  uid, date, 0, type, 0, 0  from table_b order by date desc limit 20
...
) order by date desc limit 20
于 2009-08-11T12:40:27.167 に答える
0

それはすべて、テーブルの大きさに依存します。各テーブルに数千のレコードがある場合は、最初のソリューション (UNION) で問題ありません。

より大きなテーブルでは、主に UNION の方法よりもはるかに少ないリソース (RAM) を使用し、それでもかなり高速であるため、2 番目のソリューションを使用します。

ただし、データ モデルについて考え、最適化することをお勧めします。UNION ベースのクエリを使用する必要があるという事実は、通常、3 つのテーブルをマージして "type" フィールドを追加することにより、最適化の余地があることを意味します (名前はまったく適切ではありませんが、私の主張はわかります)。

于 2009-08-11T12:36:07.947 に答える