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オブジェクトとは何かについて話しましょう

推薦する

MySQLテーブル名の大文字と小文字を区別しない設定方法の詳細な説明

デフォルトでは、Linux の MySQL はテーブル名の大文字と小文字を区別します。 MySQL ...

MySQL ビュー管理ビューの例の詳細説明 [追加、削除、変更、クエリ操作]

この記事では、例を使用して MySQL ビューの管理ビュー操作について説明します。ご参考までに、詳細...

mysql5.7.19 解凍版の詳細なインストール チュートリアル (純粋なクラックされた中国語版 SQLYog を使用)

Mysql5.7.19バージョンは今年リリースされた新しいバージョンです。最近のMySQLのバージ...

Docker 起動時の ES メモリ オーバーフローの解決方法

jvm.options ファイルを elasticsearch 構成に追加し、スタック サイズを変更...

Web 開発 js 文字列連結プレースホルダーと conlose オブジェクト API の詳細な説明

目次プレースホルダーの置き換えコンソール印刷テーブル()ログ、情報、警告、エラーグループ()、グルー...

Docker Composeオーケストレーションツールの詳細な説明

Docker の作成Docker Compose は、複数の Docker コンテナを定義して実行す...

Centos7 での nginx のインストールと設定に関する詳細なチュートリアル

注: ソフトウェアのインストールの基本ディレクトリ パスは /usr/local です。ソフトウェア...

MySQL 主キー ID を生成する方法 (自己増分、一意、不規則)

目次1. uuid関数を使用して、一意かつ不規則な主キーIDを生成します。 2. idの自動成長1....

CentOS7でパーティションのサイズを変更する方法

昨日、ある人のシステムのインストールを手伝ったのですが、自動パーティション分割をクリックするのを忘れ...

Linux 編集の開始、停止、再起動の Springboot jar パッケージ スクリプトの例

序文springboot設定ファイルでは、設定ファイルの名前には独自の意味と用途があります。 dev...

HTMLのフォントがline-heightを指定しても垂直方向に中央揃えできない問題の解決方法を詳しく説明します

による写真に示されている効果を例に挙げてみましょう。明らかに、「次へ」というテキストを水平方向だけで...

Docker+daocloudはフロントエンドプロジェクトの自動構築とデプロイを実現します

自動プロジェクト展開は大企業やユニコーン企業でよく使用され、手動でプロジェクトを展開するよりも効率的...

高可用性 Web クラスターを実装するための Keepalived+Nginx+Tomcat サンプル コード

高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Ngi...

Vue3.0のさまざまなリスニング方法の包括的な概要

目次リスナー1.ウォッチエフェクト2.見る1.1 聴くための最初の方法1.2 聞く2つ目の方法1.3...

Linuxはシェルスクリプトを使用して履歴ログファイルを定期的に削除します

1. ツールディレクトリのファイル構造 [root@www tools]# ツリーツール/ ツール/...