1

複雑なため、正確な問題とクエリを示すことはできませんが、問題を別の同様の問題に単純化します。

ここに行きます:

リンゴ、車、本、コンピューター、衣服に関する情報を含む5つのテーブルがあります。上記の各テーブルにはコメントを含めることができ、すべてのコメントはCommentsuser_id列を持つ)という単一のテーブル内に格納されます。そして、それらの5つのテーブルを独自のコメントにリンクするには、他の5つのリンクテーブル名、、、などを作成する必要がありAppleCommentsました。CarCommentsBookComments

私のクエリは、これら5つのカテゴリタイプからすべてのコメントを取得したいと考えています。

私は2つの方法を考えることができます。1つはもう1つよりも速いです。

  1. 5つのテーブルをそのリンクテーブルで結合し、次にコメントで結合しwhere comments.user_id = me、次にUNIONALLの結果を1つの結果セットに結合できます。

    SELECT <column_names> FROM AppleComments
    INNER JOIN Comments ON AppleComments.comment_id = Comments.comment_id
    WHERE Comments.user_id = me
    
    UNION ALL
    
    SELECT <column_names> FROM CarComments
    INNER JOIN Comments ON CarComments.comment_id = Comments.comment_id
    WHERE Comments.user_id = me
    etc...
    
  2. ユニオンallを使用してlinkinテーブルからすべてのコメントIDを選択し、このサブクエリをCommentsテーブルと内部結合して、それらに関する他の情報を取得できます。

    SELECT <column_names> 
    FROM (
       Select AppleComments.comment_id FROM AppleComments
       UNION ALL
       Select CarComments.comment_id FROM CarComments
       UNION ALL
       Select BookComments.comment_id FROM BookComments
       UNION ALL
       Select ComputerComments.comment_id FROM ComputerComments
       UNION ALL
       Select ClothesComments.comment_id FROM ClothesComments) AS items
    INNER JOIN Comments ON items.comment_id = Comments.comment_id
    WHERE Comments.user_id = me
    

2つ目はより高速で、実行計画が小さくなります。

問題は、exからのサブクエリ'items'のためです。2データベースからすべてのコメントを実際に選択してから、コメントテーブルと内部結合します。私の懸念は、あまりにも多くの行を処理するとパフォーマンスが低下することです。多分メモリが多すぎますか?

コメントの90%が私のものであるため、現時点ではわかりませんが、それぞれの例を少し判断すると、最初のコメントは、(合計で)少量のデータを取得するものだと思います。

DBに100万件のコメントがあり、私のコメントが100件しかない場合はどうなりますか...

ありがとう。

4

1 に答える 1

2

あなたの直感は正しいです。UNION ALL将来の最適化の可能性はほとんどなくなります。結合する前に、できる限りのことをしてください。最初のアプローチは正しいものです。

なぜ5つの異なるテーブルに類似したものがあるのか​​、そしてなぜ1対nの関係のように見えるものにリンクテーブルがあるのか​​という疑問を投げかけていることを除いて。フィールドを持つ単一のテーブルでitemtypeは不十分でしょうか?追加のデータがある場合は、追加のデータテーブルへのオプションの外部リンクがあります。

もちろん、これは作り上げられた宇宙です、私はあなたの元の問題についての手がかりを持っていません:)

于 2012-12-10T01:01:37.513 に答える