2

一言で言えば、多くの配列で PHP の array count() を使用する方が、SQL の行カウントを複数回使用するよりも高速ですか?

COUNT(*) 関数に起因する遅いクエリに問題があります。私が何をしているのかを説明し、それから私が予想していることはかなり速いかもしれません。

現在、各反復で約 20,000 行をカウントする関数をループしています。1 年の各月の行数を返します。

// 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 を配列にダンプしながら、テーブルを 1 回クエリします (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

これについては、KingCrunch に同意する必要があります。あなたが本当に見る必要があるのは、これがユーザーのボリュームが少ない場合、またはそのようなものである場合に使用しているアプリケーションのタイプです。データベースでそれを実行すると、トラフィックが大量にあり、データベースを回避する場合に高速になります。 PHPができることで過負荷になると、大規模にそのようなものに到達すると、PHPはより高速になります。常に心に留めておくべきことは、結果セットをphpに送信する場合、ネットワーク経由でデータを受信し、それをカウントする必要があるということです。これは、より多くのデータとネットワーク遅延を意味しますが、これもリモートでデシベル。ただし、最適化しすぎないようにしてください。

于 2013-03-01T00:14:54.903 に答える
2

要するに: 時期尚早の最適化はすべての悪の根源です:) したがって、通常、最終的にはそれほど重要ではありません。ただし、行数が必要な時期と場所によっては、結果を取得して処理する方法によっては、単一の配列で完全なデータを使用できないため、呼び出す配列がないことに注意してくださいcount()。不必要にメモリを消費するため、単に使用するだけcount()では、そのような配列を作成する正当な理由にはならないようです。

于 2013-03-01T00:07:13.300 に答える