MySQL の count 関数の正しい使い方の詳細な説明

MySQL の count 関数の正しい使い方の詳細な説明

1. 説明

MySQLでは、テーブル内の行の総数を取得する必要がある場合、通常は次の文を使用します。

テーブルからcount(*)を選択します。

実際、count 関数には * に加えて、定数、主キー ID、フィールドなどの他のパラメータを配置できます。では、それらの違いは何でしょうか?それらはどれくらい効率的ですか?テーブル内の行数を取得するにはどの方法を使用すればよいですか?

count 関数の動作原理を理解すれば、上記の質問に対する答えは明らかになると思います。

2. テーブル構造

上記の問題を解決するために、主キー ID と名前 (後者は null にすることができます) の 2 つのフィールドを持つユーザー テーブルを作成しました。テーブル作成ステートメントは次のとおりです。

テーブル `user` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主キー',
 `name` varchar(255) デフォルト NULL コメント '名前',
 主キー (`id`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

このテーブルには 6,000,000 件のレコードがあります。最初の 1,000,000 件のレコードの名前フィールドは空で、残りのレコードには name=id があります。ストアド プロシージャを使用してテスト データを作成するコードは次のとおりです。

-- ストアド プロシージャを使用してテスト データ区切り文字を作成します。
プロシージャ idata() を作成する
始める 
 iをintとして宣言します。 
 i=1 に設定します。 
 i<=6000000の間 
  ユーザー値(i, i)に挿入します。
  i=i+1 と設定します。 
 終了しながら;
終わり;;
デリミタ;
idata() を呼び出す。
-- 最初の 1,000,000 件のレコードの名前フィールドを null に設定します
ユーザーを更新し、ID<1000000 の場合、name=null を設定します。

3. SQL文と結果を実行する

count 関数のさまざまなパラメータの違いを区別するために、SQL の実行効率を主に実行時間とスキャンされた行数という 2 つの側面から説明します。また、返される結果から count 関数の特性も説明します。

  • * シンボル—— select count(*) from user
  • 定数 - select count(1) from user ;
  • 空でないフィールド—— select count(id) from user
  • Null 許容フィールド - select count(name) from user

3.1 * シンボル

mysql> ユーザーから count(*) を選択します。
+----------+
| カウント(*) |
+----------+
| 6000000 |
+----------+
セット内1列(0.76秒)

テーブル全体を走査し、値を取得せず (最適化後、null であってはならず、値を取得しません)、カウントを累積し、最後に結果を返します。

3.2 定数

mysql> ユーザーからcount(1)を選択します。
+----------+
| カウント(1) |
+----------+
| 6000000 |
+----------+
セット内1列(0.76秒)

テーブル全体を走査し、行ごとにデータを取得し、各行に値 1 を割り当て、フィールドが空にならないことを確認してカウントを累積し、最後に結果を返します。

3.3 空でないフィールド

mysql> ユーザーから count(id) を選択します。
+-----------+
| カウント(ID) |
+-----------+
| 6000000 |
+-----------+
セット1列(0.85秒)

テーブル全体を走査し、行ごとにデータを取得し (走査には最小のインデックス ツリーが選択されるため、同じ状況でフィールドをカウントするよりも効率的です)、各行の主キー ID を取得し、フィールドが空にならないことを確認してカウントを累積し、最後に結果を返します。

3.4 ヌル可能フィールド

mysql> ユーザーから count(name) を選択します。
+-------------+
| count(名前) |
+-------------+
| 5900001 |
+-------------+
セット内1列(0.93秒)
  • フィールド定義が空でない場合: テーブル全体を走査し、行ごとにデータを取得し、各行のフィールドを取得し、フィールドが空にならないことを確認してカウントを累積し、最後に結果を返します。
  • フィールド定義が null 値可能である場合: テーブル全体を走査し、行ごとにデータを取得し、各行のフィールドを取得し、フィールドが null 値になる可能性があるかどうかを判断し、フィールドの値が null 値であるかどうかを判断します。null 値でない場合は、カウントを累積し、最終的に結果を返します。
  • フィールドにインデックスがない場合、主キー インデックス ツリーが走査されます。

4. 実行結果の分析

4.1 結果セット

まず、結果セットの観点から見ると、最初の 3 つの SQL 文の目的は同じです。つまり、すべての行の数を返すことです。count countのパラメータが通常のフィールドで、フィールドのデフォルトがnullの場合は、フィールドがnullではない行の数を返します。

4.2 実行時間

実行時間の観点から見ると、効率はおおよそcount(可為空的字段) < count(非空字段) < count(常數) < count(*)ます。

5. 結論

Count は集計関数です。返された結果セットは行ごとに判断されます。count 関数のパラメータが NULL でない場合は累積値が 1 増加し、それ以外の場合は増加しません。最後に、累積値が返されます。

  • count(*)が最も高速な理由は、カウント時に各データ行の値を取得しないからです。
  • count(1) count(*)よりもわずかに遅い理由は、各行を取得してそれに 1 の値を割り当てるためです。
  • count(非空字段) count(1)よりもわずかに遅い理由は、各データ行から主キー ID を抽出するためです。
  • count(可為空的字段)が最も遅い理由は、各データ行のフィールドが null かどうかを判断する必要がある場合があるためです。

したがって、count(*)を使用する方が適切です。

上記はMySQLのcount関数の正しい使い方の詳しい内容です。MySQL count関数の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 大規模な MySQL テーブルに対する count() の実装を最適化しました
  • MySQL の集計関数 count の使用法とパフォーマンスの最適化テクニック
  • MySQL の InnoDB におけるカウント最適化の問題の共有
  • MySQLのCOUNT(*)のパフォーマンスについてお話しましょう
  • MySQLの行数カウントに関する簡単な説明
  • MySQL カウントを向上させる方法のまとめ
  • MySQL でのフィルター条件なしのカウントの詳細な説明
  • MySQL における count(*)、count(1)、count(col) の違いのまとめ
  • 複数のテーブルでの MySQL カウント データ例の詳細な説明
  • MySQL COUNT関数の使用と最適化

<<:  Vue の要素カレンダー コンポーネントを使用したサンプル コード

>>:  DockerHubを自分で構築する方法

推薦する

Mysql の主キーと一意キーの違いのまとめ

主キーとは何ですか?主キーは、テーブル内の各タプル (行) を一意に識別するテーブル内の列です。主キ...

フロントエンド開発者に何百万ドルもの価値をもたらす 10 のスキル

フロントエンド開発者が習得する必要のあるスキル。これらのスキルにより、フロントエンド開発者の価値は数...

Cronジョブを使用してCpanelでPHPを定期的に実行する方法

cpanel 管理バックエンドを開き、「詳細」オプションの下に「Clock Guardian Job...

エージェントを介したzabbix監視プロセスとポートの詳細なプロセス

環境の紹介オペレーティングシステム: Centos 7.4 Zabbix バージョン: zabbix...

MySQL 8の新機能である降順インデックスの基礎となる実装の詳細な説明

降順インデックスとは何ですか?インデックスについてはよくご存知かもしれませんが、降順インデックスにつ...

Linux の検索ツールの代替となるフレンドリーなツール

find コマンドは、指定されたディレクトリ内のファイルを検索するために使用されます。引数の前の文字...

uni-app WeChatアプレット認証ログイン実装手順

目次1. appIDの申請と設定1. appidの取得方法2. AppIDの設定2. 基本的なユーザ...

MySQL 文字セットの変更に関する実践的なチュートリアル

序文: MySQL では、システムが多くの文字セットをサポートしており、異なる文字セット間にはわずか...

JS初心者が配列を処理するための実践的な方法のまとめ

join() メソッド: 指定された区切り文字を使用して配列内のすべての要素を文字列に接続します。例...

Docker Docker の保存場所を変更する コンテナイメージのサイズ制限を変更する操作

これは新しいバージョンではもう不可能なようで、推奨されません。そうでない場合は、ソフト リンクを直接...

NodeJs の高メモリ使用量のトラブルシューティング実戦記録

序文これは、オンライン コンテナーの拡張によって発生した調査です。最終的には、実際の OOM が原因...

Ubuntu 16.04 mysql5.7.17 リモートポート 3306 を開く

MySQLへのリモートアクセスを有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...

Mysql テーブル、列、データベースの追加、削除、変更、クエリの問題の概要

以下は私がまとめた基本的なSQL知識です。主に参考資料として、また将来の他の初心者の助けとして、私自...

Docker で既存のイメージに基づいて新しいイメージを構築する方法

既存のイメージから新しいイメージを構築することは、Dockerfile ドキュメントを通じて行われま...