2

简而言之:在多个数组上使用 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() 来获取每个月的条目数
4

3 回答 3

4

您可以使用 SQL 的 group by 函数按月分组。

SELECT COUNT(*), MONTH(exp_date)
FROM theTableYouAreUsing
GROUP BY MONTH(exp_date)

然后在 php 中,在返回的数组中,您将获得所需月份的计数。

速度方面,这比每个月单独查询要快得多。

于 2013-03-01T00:10:36.880 回答
2

简而言之:过早的优化是万恶之源 :) 所以通常最终它并不重要。但是,请记住,根据您何时何地需要行数来获取和处理结果,您没有可用的单个数组中的完整数据,因此您没有可调用的数组count()。仅仅使用count()似乎不是创建这样一个数组的正当理由,因为它不必要地消耗内存。

于 2013-03-01T00:07:13.300 回答
2

我将不得不同意 KingCrunch 的观点。您真正需要查看的是您拥有的那种类型的应用程序,如果这是低容量的用户或类似的东西,那么如果您有大量的流量等等,那么现在在数据库中执行它会更快,并且避免使用数据库被一些 php 可以做的事情超载,那么当你大规模地处理类似的事情时,php 会更快。始终要记住的是,如果您将结果集发送到 php,它将不得不通过网络接收数据,然后对其进行计数,这意味着更多的数据和网络延迟,但再次假设这是使用远程D b。但尽量不要过度优化。

于 2013-03-01T00:14:54.903 回答