1

私はこのコードを使用しています

$sql1 = mysql_query("SELECT section_id FROM forum_posts WHERE section_id='$sectionID'  ");
$num_rows = mysql_num_rows($sql1);

フォーラムのホームページに表示する特定のカテゴリの投稿の数をカウントして、特定のセクションに投稿がいくつあるかを示します。したがって、そのタイプのすべての投稿を調べるより良いオプションがあります。これを使用すると、パフォーマンスが大幅に低下すると思います。

編集1:フォーラムの各セクションの下に投稿数を表示するだけなので、ホームページで各セクションの現在のトピック数を確認したいと思います。そのための最適なmysqlクエリは何になりますか。

編集2:phpmanualに記載されているようにmysql_query関数を置き換える必要がありますか?

4

3 に答える 3

2

sql自体でcountを使用するだけです。

$sql1 = mysql_query("SELECT count(post_id) as 'count_of_posts' FROM forum_posts WHERE section_id='$sectionID' ");

すべてのセクション数を同時に取得したい場合は、次の方法で実行できます。

$sql1 = mysql_query("SELECT section_id, count(post_id) as 'count_of_posts' FROM forum_posts WHERE section_id='$sectionID' group by section_id"); 
于 2012-09-17T19:25:02.780 に答える
1

COUNT() 集計関数を使用して行をカウントするのは、より通常の SQL です。一度に複数のセクションをカウントする必要がある場合は、GROUP BY を使用します。しかし、あなたはそれを知っていましたよね?

最初にベンチマークを行い、次に最適化します。

  1. テスト サーバー (運用仕様である必要があります) に運用サイズのデータ​​をロードします。すべてのパラメーターを本番サーバーと同じように構成します。
  2. コードを繰り返し実行して時間を計測します。
  3. 速度が低下していないようであれば、作業は完了です。

私の提案:

  1. クエリを説明します。フル テーブル スキャンを実行している場合は、セクション ID にインデックスを追加します。これにより、少なくとも完全なインデックス スキャンまで、完全なテーブル スキャンが削減されます。これはまだ遅すぎるかもしれません。
  2. それでも遅すぎる場合は、結果をどこかにキャッシュすることを検討してください。投稿が追加、削除、または別のセクションに移動されたときに、このキャッシュを無効にすることができます。
  3. キャッシュが不便または機能しない場合 (たとえば、キャッシュのヒット率が 90% 未満の場合)、カウントを永続的に保存し、手動で調整することを検討してください。投稿が変更されていない場合、セクションのカウントを再計算する必要はありません。

1e3 セクションに 1e9 の投稿があるとします。ほとんどの場合、ほとんどのセクションの投稿は変更されません。したがって、操作の影響を受けるセクションのカウントを変更するだけです。たとえば、追加/削除の場合は 1 つのセクションを更新し、移動の場合は 2 つのセクションを更新するだけで、998 セクションのカウントは変更されず、コストのかかるカウントを回避できます。オペレーション。

しかし、1e9 の投稿がある可能性は非常に低いと思います (Stackoverflow にはないと確信しています)。

Stack Overflow がタグと質問のカウントをどのように管理しているかを調査することを検討してください。

于 2012-09-17T19:32:20.667 に答える
0

SELECT distinct section_id, count(section_id) as num_of_posts FROM forum_posts WHERE section_id='$sectionID' group by section_id 次に、 $num_of_rows = $sql1['num_of_posts']; を実行します。

または、クエリをそのままにして、count($sql1);を実行します。

于 2012-09-17T19:20:14.560 に答える