COUNT(*)
の場合 count列のインデックスを取り込むため、最良の結果が得られます。 MyISAMを使用したMysql エンジンは実際に行数を保存しますが、すべての行を数えようとするたびにすべての行を数えるわけではありません。 (主キーの列に基づく)
PHPを使用して行をカウントすることは、mysqlからphpにデータを送信する必要があるため、あまり賢明ではありません。 mysql側で同じことを達成できるのに、なぜそれを行うのですか?
COUNT(*)
の場合 遅い場合は、EXPLAIN
を実行する必要があります クエリで、インデックスが実際に使用されているかどうか、どこに追加する必要があるかを確認します。
以下は最速ではありません 方法ですが、COUNT(*)
の場合があります 実際には適合しません-結果のグループ化を開始すると、COUNT
で問題が発生する可能性があります 実際にはすべての行をカウントするわけではありません。
解決策はSQL_CALC_FOUND_ROWS
です。 。これは通常、行を選択するときに使用されますが、それでも合計行数を知る必要があります(たとえば、ページングの場合)。データ行を選択するときは、SQL_CALC_FOUND_ROWS
を追加するだけです。 SELECTの後のキーワード:
SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;
必要な行を選択したら、次の1つのクエリでカウントを取得できます。
SELECT FOUND_ROWS();
FOUND_ROWS()
データ選択クエリの直後に呼び出す必要があります。
結論として、すべては実際には、エントリの数とWHEREステートメントの内容に依存します。行がたくさんある場合(数万、数百万以上)、インデックスがどのように使用されているかに本当に注意を払う必要があります。