使用 php array count() 是不是比使用 SQL 行数更快?
Posted
技术标签:
【中文标题】使用 php array count() 是不是比使用 SQL 行数更快?【英文标题】:Is it faster to use php array count() than SQL row count?使用 php array count() 是否比使用 SQL 行数更快? 【发布时间】:2013-02-28 23:58:33 【问题描述】:简而言之:在多个数组上使用 php 数组 count() 是否比多次使用 SQL 行数更快?
我遇到了一个慢查询问题,我将其归因于 COUNT(*) 函数。我将解释我在做什么,然后我预计可能会明显更快。
目前我正在循环一个函数,该函数每次迭代计算大约 20,000 行。它返回一年中每个月的行数:
// CREATE MONTHLY LINKS
public function monthly_links()
$months = array('','January','February','March','April','May','June','July','August', 'September','October','November','December');
for ($i=1 ; $i <= 12 ; $i++)
$array[] = "<a href='monthly.php?month=" . $i . "&status=3'>" . $months[$i] . " " . $this->chosen_year() . " (" . $this->number_positions_month_year($i, $this->chosen_year()) . ")</a>";
return $array;
// SHOW NUMBER OF POSITIONS FOR EACH MONTH/YEAR
public function number_positions_month_year($month, $year)
$sql = $this->client_positions_sql() . " AND MONTH(`exp_date`) = " . $month . " AND YEAR(`exp_date`) = " . $year;
$res = $this->conn->query($sql);
$count = $res->num_rows;
return $count;
在上面的示例中,代码并不那么重要,因为基本上我要问的是:执行以下操作是否更快...?
查询表一次,同时将每个月对应的 id 转储到一个数组中(会有 12 个数组) 在每个数组上使用 PHP count() 来获取每个月的条目数【问题讨论】:
请拍摄您正在使用的查询 只有正确完成mysql才会更快 这可能取决于。对其进行基准测试! 【参考方案1】:可以使用SQL的group by函数按月分组。
SELECT COUNT(*), MONTH(exp_date)
FROM theTableYouAreUsing
GROUP BY MONTH(exp_date)
然后在 php 中,在返回的数组中,您将获得所需月份的计数。
在速度方面,这比每个月单独查询要快得多。
【讨论】:
【参考方案2】:简而言之:过早的优化是万恶之源 :) 所以通常最终它并不重要。但是,请记住,根据您在何时何地需要行数来获取和处理结果的方式,您没有可用的单个数组中的完整数据,因此您没有可以调用@987654321 的数组@ 在。仅仅使用count()
似乎不是创建这样一个数组的正当理由,因为它会不必要地消耗内存。
【讨论】:
【参考方案3】:我将不得不同意 KingCrunch 对此的看法。您真正需要查看的是您拥有的那种类型的应用程序,如果这是低容量的用户或类似的东西,那么如果您有大量的流量等等,那么现在在数据库中执行它会更快,并且避免使用数据库被php可以做的事情超载,那么当你大规模地达到类似的东西时,php会更快。始终要记住的是,如果您将结果集发送到 php,它将不得不通过网络接收数据,然后对其进行计数,这意味着更多的数据和网络延迟,但再次假设这是使用远程D b。但尽量不要过度优化。
【讨论】:
以上是关于使用 php array count() 是不是比使用 SQL 行数更快?的主要内容,如果未能解决你的问题,请参考以下文章
在Python中,array.count()的数量级是否比list.count()慢几个?
php计算数组相同值出现次数的代码(array_count_values)
迭代php数组中的未知键(使用array_count_values创建)