MySQL における count(*)、count(1)、count(col) の違いのまとめ

MySQL における count(*)、count(1)、count(col) の違いのまとめ

序文

count 関数は、テーブルまたは配列内のレコードをカウントするために使用されます。count(*) は、NULL 値が含まれているかどうかに関係なく、取得された行の数を返します。最近、カウントの違いについてみんなが議論しているような気がしますので、私も書いておきます。ぜひメッセージを残して議論してください。それでは、早速、詳しい紹介を見ていきましょう。

1. テーブル構造:

dba_jingjing@3306>[rds_test]>テーブル `test_count` を作成します (
 -> `c1` varchar(10) デフォルト NULL,
 -> `c2` varchar(10) デフォルト NULL,
 -> キー `idx_c1` (`c1`)
 -> ) ENGINE=InnoDB デフォルト文字セット=utf8;
クエリは正常、影響を受けた行は 0 行 (0.11 秒)

2. テストデータを挿入します。

dba_jingjing@3306>[rds_test]>test_count値(1,10)に挿入します。
クエリは正常、1 行が影響を受けました (0.03 秒)

dba_jingjing@3306>[rds_test]>test_count に値(abc,null) を挿入します。
エラー 1054 (42S22): 「フィールド リスト」に不明な列「abc」があります
dba_jingjing@3306>[rds_test]>test_count に値 ('abc'、null) を挿入します。
クエリは正常、1 行が影響を受けました (0.04 秒)

dba_jingjing@3306>[rds_test]>test_count に値(null,null) を挿入します。
クエリは正常、1 行が影響を受けました (0.04 秒)

dba_jingjing@3306>[rds_test]>test_count に値 ('368rhf8fj'、null) を挿入します。
クエリは正常、1 行が影響を受けました (0.03 秒)

dba_jingjing@3306>[rds_test]>test_countから*を選択します。
+-----------+------+
| c1 | c2 |
+-----------+------+
| 1 | 10 |
| abc | NULL |
| NULL | NULL |
| 368rhf8fj | NULL |
+-----------+------+
セット内の 4 行 (0.00 秒)

テスト:

dba_jingjing@3306>[rds_test]>test_countからcount(*)を選択します。
+----------+
| カウント(*) |
+----------+
| 4 |
+----------+
セット内の 1 行 (0.00 秒)
   説明する: {
  "クエリブロック": {
   "select_id": 1,
   "メッセージ": "最適化されたテーブルを選択してください"
  セットに 1 行、警告 1 件 (0.00 秒)
dba_jingjing@3306>[rds_test]>test_countからcount(1)を選択します。
+----------+
| カウント(1) |
+----------+
| 4 |
+----------+
セット内の 1 行 (0.00 秒)
   説明する: {
  "クエリブロック": {
   "select_id": 1,
   "メッセージ": "最適化されたテーブルを選択してください"
  セットに 1 行、警告 1 件 (0.00 秒)
dba_jingjing@3306>[rds_test]>test_countからcount(c1)を選択します。
+-----------+
| カウント(c1) |
+-----------+
| 3 |
+-----------+
セット内の 1 行 (0.00 秒)
   "テーブル": {
    "テーブル名": "test1",
    "アクセスタイプ": "インデックス",
    "キー": "idx_c1",
    「使用されるキーパーツ」: [
     「c1」
    ]、
    "キーの長さ": "33",

では、なぜ「key_length」が「33」であるのでしょうか? セカンダリ インデックスとは何ですか?次のセクションを参照

count(*)とcount(1)の間には違いはありませんが、count(col)の間には違いがあります。

実行プランには特徴があります。インデックスとテーブルをクエリしないことがわかり、場合によっては、テーブルをクエリせず非常に高速になる、最適化された select tables が表示されます。

Extra では、「Select tables optimized away」と表示されることがあります。これは、最適化するより良いものが何もないことを意味します。

単純なカウントクエリ(例:explain select count(*) from people)の説明では、余分な
セクションには「最適化されたテーブルを選択してください」と表示されます。
これは、MySQL がテーブル内部から直接結果を読み取ることができるため、選択を実行する必要がないためです。

---MySQL の「Select tables optimized away」の意味は、「これ以上最適化できるものはありません」ではありません。公式の説明の要点は次のとおりです。
MySQLは結果を直接読み取ることができる

したがって、合理的な説明は次のようになります。

1 データはすでにメモリ内に存在し、直接読み取ることができます。

2 データは、関数や式の値などの計算の結果と考えることができます。

3 クエリ結果がオプティマイザによって「予測」されると、実行しなくても結果を取得できるため、「選択を実行する必要はありません」。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • この記事では、MySQL count(*)、count(1)、count(col)の違いについて説明します。

<<:  開発者とオペレーターが注目すべき Linux デバッグ ツール [推奨]

>>:  JavaScriptのURLオブジェクトとは何かについて話しましょう

推薦する

Vueは時間カウントダウン機能を実装する

この記事では、Vueの具体的なコード例を参考までに紹介します。具体的な内容は以下のとおりです。必要:...

nginx で複数の仮想ホストを設定する方法の例

nginx で仮想ホスト vhost を設定すると非常に便利です。 nginx設定ファイルnginx...

純粋な CSS3 でペットの鶏のサンプルコードを実現

最近、CSS3に関する知識や記事をたくさん読んできましたが、CSS3はとても便利に使えると思います。...

フォーム送信時に追加のパラメータを渡すためのいくつかの一般的な方法

フォームを送信するときに、送信前に追加のパラメータが追加される状況が発生する場合があります。この問題...

背景画像のみを180度回転させるCSS3実装例

1. 心の旅最近コックピットを書いていたときに、背景画像を単純に特定の角度に回転させるという問題につ...

MySQL 8.0.11 のインストールと設定方法のグラフィック チュートリアル (win10)

この記事ではMySQL 8.0.11のインストールと設定方法を参考までに記録します。具体的な内容は以...

IE9beta版ブラウザはHTML5/CSS3をサポート

IE9 は Microsoft の第二の革命だと言う人もいます。これは誇張ではないと思います。IE6...

JSインターセプト文字列の3つの方法の詳細な説明

JS には、文字列をインターセプトするための 3 つのメソッド、 slice() 、 substri...

Ubuntu 20.04にROS Noeticをインストールする方法

免責事項:プロジェクトでは ROS 環境を使用する必要があるため、これは Ubuntu 20.04 ...

海外でダウンロードできる25個の新鮮で便利なアイコンセット

1. Eコマースアイコン2. アイコンスイーツ2 3. 携帯電話アイコンパック4. 旗アイコンセット...

写真のプレビューとアップロード機能を実現するhtml+css+js

はじめに: Web ページを作成するときに、画像をアップロードする必要がある場合がよくあります。画像...

ディスクを破壊せずに Linux で dd コマンドを使用する方法

故障したストレージ ドライブからデータを救出する場合でも、アーカイブをリモート ストレージにバックア...

CSS で要素を垂直方向に中央揃えする 7 つの方法

【1】中央の要素の幅と高さを知る絶対値 + 負のマージンコードの実装 .wrapBox5{ 幅: 3...

divは、自動入力スタイルをブロックする入力ボックスとして入力を使用せずにコンテンツを入力できます。

今日、私は公開用の動的なウィンドウ スタイルを設計しましたが、マウスで入力をクリックしたときにブラウ...

JavaScript の高度なプログラミングの基本参照型

目次1. 日付2. 正規表現3. オリジナルパッケージタイプ序文:参照値(オブジェクト)は、 Dat...