[解決済み] MySQL 行数をカウントする最速の方法
質問
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ステートメントに何が書かれているかに帰着します。行数が多い場合(数万、数百万、それ以上)、インデックスがどのように使用されているかに本当に注意を払う必要があります。
関連
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
[解決済み] MySQL エラー 1153 - 'max_allowed_packet' バイトより大きいパケットを受け取りました。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] リストに値が存在するかどうかを確認する最速の方法
-
[解決済み] MySQL で特定のカラム名を持つすべてのテーブルを見つけるにはどうすればよいですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mysqlにおけるvarcharの日付比較とソートの実装
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
MySQLインストールチュートリアル(Linux版
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
mysql5.7のインストールと、無料・長期利用を目的としたNavicateの導入プロセスについて
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'
-
Mysqlの使用中に発生したエラーの一部
-
[解決済み] SQLを使用してSUMとSUBTRACTを行うには?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] どちらが速いですか?SELECT SQL_CALC_FOUND_ROWS FROM `table`, or SELECT COUNT(*)