複雑なため、正確な問題とクエリを示すことはできませんが、問題を別の同様の問題に単純化します。
ここに行きます:
リンゴ、車、本、コンピューター、衣服に関する情報を含む5つのテーブルがあります。上記の各テーブルにはコメントを含めることができ、すべてのコメントはComments
(user_id
列を持つ)という単一のテーブル内に格納されます。そして、それらの5つのテーブルを独自のコメントにリンクするには、他の5つのリンクテーブル名、、、などを作成する必要がありAppleComments
ました。CarComments
BookComments
私のクエリは、これら5つのカテゴリタイプからすべてのコメントを取得したいと考えています。
私は2つの方法を考えることができます。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...
ユニオン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件しかない場合はどうなりますか...
ありがとう。