0

情報の半複雑な検索を必要とする単純なテーブルがあります。表は次のとおりです。

表-投稿

id        - bigint(20)
title     - varchar(250)
content   - longtext
parent_id - int(20)
type      - varchar(50)

現在、postsテーブルに入るタイプには、グループ、ディスカッション、返信の3つの異なる値があります。データは次のように保存されます。

  1. 返信には、parent_idとしてディスカッションIDがあります。
  2. ディスカッションには、parent_idとしてグループID(または0)があります。

サイトのメンバーはグループに参加できます。そのグループからのディスカッションと返信をメールダイジェストに含めたいと思います。現在、これを実現するためにLEFT JOINSを使用していますが、これを実現するには多くの結合が必要であり、テーブルが急速に大きくなるにつれてパフォーマンスが低下するため、重くなります。

より良い実装のための提案はありますか?入れ子集合モデルを調べましたが、取得は最上位のグループエントリに対するアクションに基づいているため、ここでは役に立たないと思います。したがって、取得されるデータはそれに関連付ける必要があります。

考えと反応は大歓迎です。

4

1 に答える 1

1

データ モデルが、返信がディスカッションにあり、グループにある場合、これらのエンティティに対して 3 つの異なるテーブルが必要です。これにより、クエリを最適化するためのより多くの情報が SQL エンジンに提供されます。

それには遅すぎるかもしれません。その場合、適切な索引があることを確認する必要があります。たとえば、グループ内のすべてのディスカッションを取得するには、次のようなクエリがあります。

select *
from posts p
where p.parent_id = XXX and p.type = 'Discussion'

typeこれは、おそらく posts(type, id) にインデックスが必要であることを示唆しています。他のどのインデックスが役立つかを確認するには、質問を変更して、使用しているクエリの一部を含める必要があります。

于 2013-01-31T15:49:22.813 に答える