2011-01-23 3 views
0

SMFフォーラムなどのオープンソースプロジェクトを見てきましたが、カウントのように見える特殊なログテーブルが組み込まれています。掲示板、メンバー、トピック、検索結果まで特殊なログテーブルを維持するか、各SQLでエントリ数を計算する方が良いですか

現在私のプロジェクトでは、このようなテーブルをまったく使用せず、代わりにSQL_CALC_ROWSまたはCOUNTを使用して、検索クエリなどのエントリの合計数を取得します。ログテーブルを使用することが有効な解決策であるのか、その逆であるのか不思議に思っていました。

同様に、私はスピードブーストでも可能なウェブアプリケーションで同じ方法を使用しました。必要なときに特定のテーブルの数値カウントを自動的に更新するプログラムを設定するのではなく、GROUP_CONCAT, COUNTなどを使用して特殊SQLクエリを実行する際のオーバーヘッドは何ですか?

たとえば、1ページでメンバー数、クラシファイドエントリ数、アクティブユーザー数などの統計情報を表示する必要がある場合、通常はmysqlでSQL_CALC_ROWS + FOUND_ROWSを実行します。

答えて

1

COUNTを使用すると、本質的にすべての行の数をカウントする必要があり、通常はフルスキャンが必要です。したがって、性能上の理由からこの結果をキャッシュすることが有利である。

これは正規化に違反し、データが変更されるたびにキャッシュされた値が更新されない場合、わずかな不一致が発生する可能性があることに注意してください。

たとえば、検索を実行して「105000のうちの1〜10の結果」を表示する場合は、結果がすばやく返されることが重要です。

+0

基本的には、ユーザーが追加または削除を行うたびに、ログテーブルの最新のカウント値を更新するための追加のクエリを実行することを意味します。 – Ali

+0

それは異なります。たとえば、行数が格納されるので、MyISAMテーブルでは非常に高速です。私は他のエンジンがCOUNTを最適化する方法を知っていて、インデックスのみを使ってそれらを実行することを管理していると思います。 – arnaud576875

+0

普通のリストの場合、カウントはちょっと分かりやすい固定ですが、検索条件が可変な動的検索に関してはどうでしょうか。 – Ali

0

私はMarkと同意します。テーブルが十分大きければ、毎回カウントするのが本当に遅くなる可能性があります。最新の統計情報に応じて、いくつかのアプローチから選択できます。毎日の更新統計と同様、統計値は常に正確ではありませんが、おそらく最もコストのかからないオプションです。別の可能性は、データセットを変更しているときに統計情報を再計算することです。しかし、多くの挿入/削除がある場合、これは遅くなる可能性があります。

関連する問題