私は php で (楽しみのために) フォーラムを作成しています。また、フォーラムごとの投稿とトピックの量も表示したいと考えています。スレッド/トピックの数を表示するデータベースのフォーラムに列を追加し、誰かがトピックを作成/削除するたびに更新するか、フォーラム ページが読み込まれるたびにトピック/スレッドの数をカウントする方が良いですか? この場合の一般的な慣行は何ですか?
4 に答える
レコードを数えることは、これを行うための唯一の信頼できる方法です。カウントを保存すると、並行性の問題に対処する必要があります。データベースにチャンスを与え、それが実際の問題になった場合にのみ修正してください。私の経験では、COUNT(*)は驚くほど高速です。
120万レコードのテーブルがあります(適切なインデックスがあります)。試したばかりのselect count(*) from table_name where field=11;
場合、0.02秒かかり、104を返します。500kレコードをカウントするには、0.15秒かかります。これは、かなり低スペックのVPSでmysqlを使用しています。
重要なことは、いくつかのパフォーマンステストを実行し、真のパフォーマンスの問題がある場合にのみ、最も簡単で信頼性の高いソリューションから最適化することです。
データベースの正規化規則では、データベース内の他の値に基づいてプログラムで構築できる値をデータベース内に持つべきではないと規定されています。したがって、「適切なエンジニアリング」がすべての場合は、トピックを表示する必要があるたびにトピックをカウントする必要があります。
通常の状況では、カウンター値を保持してもパフォーマンスは大幅に向上しません。これらの値を表示する必要があるたびにそれらの値を再計算することによるパフォーマンスへの影響が、たとえ目立ったとしても無視できるような方法で、クエリを作成できるはずです。他の投稿で示されCOUNT
ているように、条件が指定されていても、非常に高速になる可能性があります。必要に応じてインデックスを使用することを忘れないでください。
最終的には、あなたが決める必要があります。必要な使用状況によっては、データベースを正規化するとパフォーマンスが低下し、代償を払ってアプリケーションのパフォーマンスが少し低下し、どこかにカウンターが追加されることがあります。ただし、データベースの非正規化は常に最後の手段にする必要があります。
この 2 つの手順はオプションではないと思います。
If you dont update the count whenever someone creates/deletes a thread,
which count will you display on your forum?
更新、つまり作成/削除があるたびに、カウンターをインクリメント/デクリメントする必要があります。次に、表示中にいつでもカウントを表示できます。
新しい投稿が追加または削除されるたびにカウントを更新することをお勧めします。この更新は正確である必要があるため、ロックを行う必要があります。ロックすると、親レコードで競合が発生します (フォーラムを更新するスレッド、スレッドを更新する投稿など)。この更新が高速になるように、インデックスが定義されていることを確認してください。
ユーザーがフォーラムを参照するときは、レコードをまったくロックしないでください。100% 正確であることは、たとえば会計ソフトウェアほど重要ではないため、ダーティ リードは気にしません。フォーラムは生き物なので、ページが読み込まれるたびに少し違って見えても問題ありません。
また、カウントが正しいことを確認するために、ときどきいくつかのクエリを実行することもできます。