1. ホーム
  2. mysql

[解決済み] MySQL 行数をカウントする最速の方法

2022-05-28 11:15:34

質問

MySQL で行数をカウントするには、どの方法がより速いですか?

これです。

SELECT COUNT(*) FROM ... WHERE ...

あるいは、代替案。

SELECT 1 FROM ... WHERE ...

// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()

これは明らかにデータベースの領域であり、このようなことを内部で決定する場合、データベースエンジンは他の誰よりも高速であるべきだからです。

どのように解決するのですか?

あなたが COUNT(*) とすると、カラムのインデックスを数えるので、最適な結果になります。MySQL で MyISAM のエンジンは実際に行数を保存しており、すべての行を数えようとするたびに数えるわけではありません。(主キーのカラムに基づく)

行数を数えるために 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;

必要な行を選択した後、この単一のクエリでカウントを取得することができます。

SELECT FOUND_ROWS();

FOUND_ROWS() は、データ選択クエリの直後に呼び出されなければなりません。


結論として、すべては実際にどれだけの項目があるか、そしてWHEREステートメントに何が書かれているかに帰着します。行数が多い場合(数万、数百万、それ以上)、インデックスがどのように使用されているかに本当に注意を払う必要があります。