简而言之:在多个阵列上使用PHPs数组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;
}
代码在上面的示例中并不重要,因为基本上我要问的是:执行以下操作会更快吗?
答案 0 :(得分:4)
您可以按功能使用SQL按组分组。
SELECT COUNT(*), MONTH(exp_date)
FROM theTableYouAreUsing
GROUP BY MONTH(exp_date)
然后在php中,在返回的数组中,您将获得所需月份的计数。
速度方面,这比每个月的单独查询要快得多。
答案 1 :(得分:1)
简而言之:过早优化是万恶之源:)所以通常最终它并不重要。但是,请记住,根据您需要获取和处理结果的行数的时间和位置,您没有可用的单个数组中的完整数据,因此您没有要调用的数组{{ 1}}。仅仅使用count()
似乎不是创建这样一个数组的正当理由,因为它不必要地消耗内存。
答案 2 :(得分:1)
我将不得不同意KingCrunch。你真正需要看的是你所拥有的应用程序类型,如果这是用户的低温或类似的东西那么在数据库中这样做现在会更快,如果你有大量的流量等等等等,并避免数据库得到soemthing php超载,然后当你达到大规模的东西时,php会更快。要记住的一点是,如果你将结果集发送到php,它将不得不通过网络重新获取数据,然后计算它意味着更多的数据和网络延迟,但再次假设这是一个远程D b。但尽量不要过度优化。