最佳地计算特定id的mysql表中的行数

时间:2012-09-17 19:18:37

标签: php mysql optimization query-optimization

我正在使用此代码

$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函数吗?

3 个答案:

答案 0 :(得分: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"); 

答案 1 :(得分:1)

使用COUNT()聚合函数计算行数是更正常的SQL。如果您需要一次计算几个部分,请使用GROUP BY。但你知道吗,对吧?

首先是基准,优化第二。

  1. 使用生产大小的数据加载测试服务器(必须是生产规范);配置所有参数与生产服务器相同。
  2. 反复运行代码并计时。
  3. 如果它看起来不慢,那你就完蛋了。
  4. 我的建议:

    1. 解释查询。如果它正在运行全表扫描,则在节ID上添加索引。这应该减少全表扫描,至少减少到完整索引扫描。这可能还是太慢了。
    2. 如果这仍然太慢,请考虑在某处缓存结果。添加,删除或移动帖子到其他部分时,您可以使此缓存无效。
    3. 如果缓存不方便或不起作用 - 例如,如果缓存的命中率低于90%,请考虑永久存储计数,并手动调整它们。然后,当帖子没有更改时,您无需重新计算某个部分的计数。
    4. 假设您在1e3部分中有1e9个帖子。大多数时候,大多数部分的帖子都不会改变。因此,您只需修改受操作影响的部分的计数 - 例如,对于添加/删除,您只需更新一个部分,对于移动,两个部分,留下998个部分的计数未经修改并避免昂贵的计数操作

      但我认为你不太可能有1e9个帖子(我确定Stackoverflow没有)。

      考虑调查Stack Overflow如何管理其标签 - 问题计数。

答案 2 :(得分: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);