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を自分で構築する方法

推薦する

Dockerを使用してPythonランタイム環境の基本イメージを作成する方法

1. 準備1.1 Pythonインストールパッケージをダウンロードします(注:Pythonバージョン...

Apache をインストールした後、サービスを開始できません (サービスを開始するとエラー コード 1 が表示されます)

目次1. エラーメッセージ2. エラーの原因3. 解決策1. エラーメッセージ1. インストール後、...

MySQLデータファイルの保存場所を表示する方法

次のような疑問が湧くかもしれません。MySQLをローカル (自分のコンピュータ) にインストールした...

ローカル画像サーバーのNginx構成の実装

目次1. Nginx の紹介2. 画像サーバーの構築1. Nginx の紹介Nginx はリバース ...

CentOS8 でローカル yum ソースを構成するための詳細なチュートリアル

centos8 ディストリビューションは、BaseOS および AppStream リポジトリを通じ...

h5入力ボックスプロンプト+通常のテキストボックスプロンプトを実装する方法

XML/HTML コードコンテンツをクリップボードにコピー<入力 id = "ユーザ...

Centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar の簡単な分析

Baiduクラウドディスク:リンク: https://pan.baidu.com/s/1hv5rUW...

MySQLとRedisでセカンダリキャッシュを実装する方法の詳細な説明

Redis の紹介Redis は完全にオープンソースで無料であり、BSD プロトコルに準拠しており、...

XHTML タグのネスト規則の分析

XHTML 言語では、ul タグに li が含まれ、dl タグに dt と dd が含まれることは誰...

HTML テーブルタグチュートリアル (17): テーブルタイトルの垂直配置属性 VALIGN

表のキャプションは表の上または下に配置でき、プロパティで調整できます。デフォルトのテーブル タイトル...

Nginx リバース プロキシを使用して go-fastdfs を実行する例

背景go-fastdfs は、http プロトコルをサポートする分散ファイルシステムです。一般的なプ...

vue-cropper コンポーネントは画像の切り取りとアップロードを実現します

この記事では、画像の切り取りとアップロードを実装するためのvue-cropperコンポーネントの具体...

Python で pymysql モジュールを使用して MySQL データベースに接続する

pymysqlをインストールするpip install pymysql 2|0pymysqlの使用2...

モバイルデバイスでインラインスクロールを実装するための4つのソリューションの詳細な説明

ニーズの発見領域の一部のみスクロールでき、残りの部分は移動できない場合、どのような方法を使用しますか...

JavaScript における this ポイントの問題の詳細な説明

要約する地球環境 ➡️ ウィンドウ通常関数 ➡️ ウィンドウまたは未定義コンストラクター ➡️ 構築...