Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 优化计算特定id的mysql表中的行数_Php_Mysql_Optimization_Query Optimization - Fatal编程技术网

Php 优化计算特定id的mysql表中的行数

Php 优化计算特定id的mysql表中的行数,php,mysql,optimization,query-optimization,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:我只需要在论坛中显示每个部分下的帖子数量,所以我想在主页上查

我正在使用这个代码

$sql1 = mysql_query("SELECT section_id FROM forum_posts WHERE section_id='$sectionID'  ");
$num_rows = mysql_num_rows($sql1);
计算特定类别下的帖子数量,以便在论坛主页上显示特定部分中有多少帖子。 那么,有没有更好的选择来浏览所有这类帖子呢。我认为如果我使用它,将是一个巨大的性能消耗

编辑1:我只需要在论坛中显示每个部分下的帖子数量,所以我想在主页上查看每个部分到目前为止有多少主题。 最佳的mysql查询是什么


编辑2:我是否应该替换PHP手册中所述的mysql查询功能?

选择不同的分区id,将(分区id)作为论坛分区中的分区id=“$sectionID”按分区id分组的分区帖子数量进行计数
然后执行$num_of_rows=$sql1['num_of_posts']


或者保持查询的原样,进行
计数($sql1)

只需在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"); 

使用count()聚合函数对行进行计数是更普通的SQL。如果需要同时计算多个部分,请使用分组方式。但你知道,对吗

先基准,再优化

  • 用生产规模的数据加载测试服务器(必须是生产规格);配置与生产服务器相同的所有参数
  • 重复运行代码并计时
  • 如果它看起来不慢,你就完了
  • 我的建议是:

  • 解释这个问题。如果正在运行完整表扫描,则在节ID上添加索引。这将减少完整表扫描,至少减少到完整索引扫描。这可能还是太慢了
  • <>如果这仍然太慢,考虑将结果缓存在某个地方。当文章被添加、删除或移动到其他部分时,可以使此缓存无效
  • 如果缓存不方便或不工作——例如,如果缓存上的命中率小于90%,请考虑永久存储计数,并手动调整它们。然后,当一个部分的帖子没有更改时,您不需要重新计算该部分的计数
  • 假设您在1e3部分中有1e9文章。大多数时候,大多数部门的帖子都不会改变。因此,您可以只修改受操作影响的区段的计数-例如,对于添加/删除,您只更新一个区段,对于移动,更新两个区段,保留998个区段的计数不变,并避免昂贵的计数操作

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


    考虑调查堆栈溢出如何管理其标记计数。

    请不要使用mysql函数,它已弃用(请参阅),并且易受sql注入攻击。在论坛帖子中使用或立即使用大约10k的帖子查询时间为0.02秒。是否可以更优化?如果要计算行数,请使用count()查询。任何进一步的优化都可能需要等待。不确定是否有理由使用不同的、按唯一分区分组的id就足够了。