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. 解释查询。如果它正在运行全表扫描,则在 Section ID 上添加索引。这应该减少全表扫描,至少减少全索引扫描。这可能仍然太慢。
  2. 如果这仍然太慢,请考虑在某处缓存结果。当帖子被添加、删除或移动到另一个部分时,您可以使此缓存无效。
  3. 如果缓存不方便或不起作用 - 例如,如果缓存的命中率低于 90%,请考虑永久存储计数并手动调整它们。然后,当其帖子未更改时,您无需重新计算该部分的计数。

假设您有 1e9 个帖子,分 1e3 个部分。大多数时候,大多数版块的帖子都不会改变。因此,您只需修改受操作影响的部分的计数 - 例如,对于添加/删除,您只需更新一个部分,对于移动,两个部分,保留 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 回答