さて、私は PHP と MySQL を使用してフォーラム ソフトウェアを作成することを楽しんでいますが、常に私を悩ませていることが 1 つあります。
フォーラムのリストを表示するフォーラムのメイン ページ。各フォーラムには、フォーラム名、そのフォーラムで行われた投稿の数、そのフォーラムで行われたディスカッションの数、およびフォーラムの最後の投稿者が表示されます。これらすべてが異なるテーブルに格納されているときに、そのすべてのデータを取得するという問題があります。それを取得することは大した問題ではなく、実際にはまったく問題ではありませんが、それを効率的に行うことが私が求めていることです。
私の現在のアプローチはこれです。さまざまなテーブル (「投稿」、「ディスカッション」、「フォーラム」など) からデータを取得する代わりに、現在の投稿、ディスカッション、および最後の投稿者の数をフォーラム テーブル自体に静的に格納します。 「フォーラム」テーブルを更新し、投稿数を 1 増やし、最後の投稿者を更新します。新しいディスカッションを作成している場合は、ディスカッションも 1 増やします。これは、何らかの理由で非効率的で汚いように思えますが、それは私だけかもしれません。
そして、恐ろしく効率が悪いのではないかと私が恐れているもう 1 つのアプローチがあります。実際に「投稿」、「ディスカッション」、「フォーラム」の各テーブルに出向き、データを取得します。これの問題は、1 つのページに何百ものフォーラムが存在する可能性があることです...そして、投稿またはディスカッションの数を取得するために COUNT ステートメントを使用する必要があります。つまり、サブクエリを使用する必要があります。最後のポスターを取得するための 3 番目のサブクエリ。そうは言っても...クエリは、次の疑似コードのようなものになります。
SELECT foruminfo, (
SELECT COUNT(id)
FROM posts
WHERE forumId = someid
), (
SELECT COUNT(id)
FROM discussions
WHERE forumId = someid
), (
SELECT postinfo
FROM posts
WHERE forumId = someid
ORDER BY postdate
DESC LIMIT 1
)
FROM forums
ORDER BY position DESC;
したがって、基本的に、何百ものフォーラムがリストされている場合、これらのサブクエリは何百回も実行できます。また、毎秒何百人ものユーザーがページを表示しているため、これはかなりの負担になるのではないでしょうか? サブクエリが通常のクエリと同じ量の負荷を引き起こすかどうかは完全にはわかりませんが、もしそうなら、それは確かに恐ろしく非効率的であるように思われます.
何か案は?:(