MySQL count(1)、count(*)、count(field)の違い

MySQL count(1)、count(*)、count(field)の違い

データベース内の行数に関しては、MySQL と Oracle の両方に COUNT という関数を使用できます。

しかし、このよく使われる COUNT 関数には、特に就職面接のときに多くの謎が隠されており、注意しないと簡単に悪用される可能性があります。信じられないなら、次の質問に答えてみてください。

> 1. COUNT にはいくつの用途がありますか?
> 2. COUNT(フィールド名)とCOUNT(*)のクエリ結果の違いは何ですか?
> 3. COUNT(1)とCOUNT(*)の違いは何ですか?
> 4. COUNT(1)とCOUNT(*)のどちらがより効率的ですか?
> 5. Alibaba Java開発マニュアルではなぜCOUNT(*)の使用を推奨しているのですか?
> 6. MySQL の MyISAM エンジンは COUNT(*) に対してどのような最適化を行いますか?
> 7. MySQL の InnoDB エンジンは COUNT(*) に対してどのような最適化を行いますか?
> 8. 上記の COUNT(*) の MySQL 最適化の重要な前提は何ですか?
> 9. SELECT COUNT(*) を実行するときに、where 条件を追加するかどうかで違いが生じますか?
> 10. COUNT(*)、COUNT(1)、COUNT(フィールド名)の実行プロセスは何ですか?
上記の 10 個の質問にすべて正しく答えることができれば、COUNT 関数を本当に理解していることになります。

1. COUNTの初見

1. COUNT(expr) は、expr の値が NULL ではない SELECT ステートメントによって取得された行の数を返します。結果は BIGINT 値になります。

2. クエリ結果がレコードにヒットしない場合は0を返します。

3. ただし、COUNT(*) の統計結果には NULL 値を持つ行の数も含まれることに注意してください。

COUNT(id) と COUNT(*) に加えて、COUNT(constant) (COUNT(1) など) を使用して行数をカウントすることもできます。では、これら 3 つの SQL ステートメントの違いは何でしょうか。どちらがより効率的でしょうか? Alibaba Java 開発マニュアルでは、COUNT(*) ではなく COUNT(列名) または COUNT(定数) の使用が禁止されているのはなぜですか?

2. COUNT(フィールド)、COUNT(定数)、COUNT(*)の違い

COUNT(定数) と COUNT(*) は、条件を満たすデータベース テーブルの行数を直接照会することを示します。

COUNT(列名)は条件を満たす列の値がNULLではない行の数を示します。

COUNT(*) は、SQL92 で定義された行をカウントするための標準構文です。標準構文であるため、MySQL データベースは大幅に最適化されています。

SQL92 はデータベースの ANSI/ISO 標準です。言語 (SQL) とデータベースの動作 (トランザクション、分離レベルなど) を定義します。

3. COUNT(*)の最適化

MySQL は主に 2 つの実行エンジンを使用します。

  • InnoDB エンジン
  • MyISAM エンジン

MyISAM はトランザクションをサポートしておらず、MyISAM のロックはテーブル レベルのロックです。一方、InnoDB はトランザクションと行レベルのロックをサポートしています。

マイISAM

MyISAM は、テーブル内の行の合計数を個別に記録するという単純な最適化を行っています。count(*) を実行すると、where 条件がない限り、直接返すことができます。 MyISAM はテーブルレベルのロックを使用し、同時行操作は行われないため、結果は正確です。

翻訳

InnoDB はトランザクションをサポートしており、ほとんどの操作は行レベルのロックであるため、この種のキャッシュ操作は使用できません。行は並行して変更される可能性があるため、キャッシュ レコードは不正確になります。

ただし、InnoDB では COUNT(*) ステートメントに対していくつかの最適化が行われています。

テーブルの特定の内容に注意を払わずに、低コストのインデックスを通じてテーブルをスキャンします。

InnoDB のインデックスは、クラスター化インデックス (主キー インデックス) と非クラスター化インデックス (非主キー インデックス) に分かれています。クラスター化インデックスのリーフ ノードにはレコードの行全体が格納され、非クラスター化インデックスのリーフ ノードにはレコードの行の主キー値が格納されます。

MySQL は、テーブルをスキャンするために、最小の非クラスター化インデックスを選択することを優先します。

最適化の前提は、クエリ ステートメントに where 条件と group by 条件が含まれていないことです。

4. COUNT(*) と COUNT(1)

MySQL の公式ドキュメントには次のように書かれています:

InnoDB は SELECT COUNT(*) と SELECT COUNT(1) 操作を同じように処理します。パフォーマンスの違いはありません。

したがって、count(1) と count(*) の場合、MySQL の最適化はまったく同じであり、どちらが高速であるかは疑問の余地がありません。

ただし、SQL92 で定義されている行をカウントするための標準構文であるため、count(*) を使用することをお勧めします。

5.COUNT(フィールド)

テーブル全体のスキャンを実行して、指定されたフィールドの値が NULL かどうかを判断します。そうでない場合は、値を追加します。

パフォーマンスはcount(1)やcount(*)よりも遅くなります。

6. まとめ

COUNT 関数は主にテーブル内の行数をカウントするために使用されます。主な使用法は、COUNT(*)、COUNT(field)、COUNT(1)です。

COUNT(*) は SQL92 で定義された行をカウントするための標準構文であるため、MySQL ではこれに対して多くの最適化が行われています。MyISAM は COUNT(*) クエリに対してテーブル内の行の合計数を直接記録しますが、InnoDB はテーブルをスキャンするときにコストを削減するために最小のインデックスを選択します。もちろん、これらの最適化の前提は、where および group 条件クエリがないことです。

InnoDBでは、COUNT(*)とCOUNT(1)の実装に違いはなく、効率も同じですが、COUNT(field)ではフィールドの非NULLチェックが必要なので、効率は低くなります。

COUNT(*) は SQL92 で定義された行をカウントするための標準構文であり、非常に効率的であるため、テーブル内の行数を照会するには COUNT(*) を直接使用してください。

参考リンク: MySQL の COUNT ステートメントは、面接官にひどく苦しめられる可能性があります。 ?

MySQL count(1)、count(*)、count(field)の違いについての記事はこれで終わりです。MySQL count(1)、count(*)、count(field)についての詳細は、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL における count(*)、count(1)、count(col) の違いのまとめ
  • 選択カウントとMySQLスキルの違いの分析
  • MySQL の count() と sum() の違いの詳細な紹介

<<:  CSS3 を使用した背景ぼかし効果の 3 つの例

>>:  HTMLウェブページの基本概念の簡単な分析

推薦する

IE6 の select を div でカバーできないバグの解決方法

div を使用してマスクを作成したり、ポップアップ ウィンドウをシミュレートしたりします。ただし、I...

js は複数の画像を zip にパッケージ化します

目次1. ファイルをインポートする2. HTMLページ3. メインコード4. 画像をbase64に変...

ウェブサイトのコンテンツの100~1%はナビゲーションである

ウェブサイトでは、コンテンツの(100-1)%がナビゲーションです1. ジェシー・ジェームズ・ギャレ...

CentOSはローカルyumソース/Alibaba Cloud yumソース/163yuanソースを設定し、yumソースの優先順位を設定します。

1. Centosイメージを使用してローカルのyumソースをビルドするCentOS をインストール...

JavaScript スクリプトが実行されるタイミングの詳細な説明

JavaScript スクリプトは HTML 内のどこにでも埋め込むことができますが、いつ呼び出され...

MySQL スロークエリログの詳細な理解

目次スロークエリログとは何ですか?スロークエリを有効にする方法ログ分析ツール mysqldumpsh...

Tomcatのクラスロードメカニズムを説明する記事

目次- 序文 - - JVM クラスローダー - 1. JVMクラスローダー2. クラスローダーのソ...

MySQL 8.0.17 インストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.17のインストールグラフィックチュートリアルを紹介します...

JavaScript コンソールのその他の機能

目次概要コンソールログコンソール.infoコンソール.警告コンソールエラーコンソールテーブルコンソー...

case when文のエラー問題の詳細な説明

序文MySQL データベースでは、if else のような判断演算を使用することがあります。では、M...

Vueは、サイドナビゲーションバーをタブページに関連付けるサンプルコードを実装します。

目次テクノロジースタック効果分析するテクノロジースタックサイドバー用Antdtabは要素を使用します...

Vue で動的に読み込まれたローカル画像を処理する方法

問題を見つける今日は、vue ファイルにローカル画像を導入する際に問題が発生したので、この記事を書き...

CSS における px、rem、em、vh、vw の違いを簡単に分析します

絶対長さピクセルpx はピクセル値であり、メートルやセンチメートルのような固定の長さです。相対的な長...

モバイルデバイスで 1 ピクセルの境界線の問題を解決するいくつかの方法 (5 つの方法)

この記事では、モバイルデバイス上の 1 ピクセルの境界線の問題を解決する 5 つの方法を紹介します。...

HTML テーブル セルの幅と高さを設定する方法

Web ページを作成するときに、テーブルの幅が揃っていないという問題に遭遇することがよくあります。 ...