ホームページ >データベース >mysql チュートリアル >MySQL Count関数の使い方の違いまとめ

MySQL Count関数の使い方の違いまとめ

藏色散人
藏色散人転載
2022-11-29 16:47:112003ブラウズ

まえがき

みなさん、MySQL の Count についてどのくらい知っていますか?

統計データの需要は非常に簡単に得られます。さて、MySQL ではさまざまな計算関数もサポートされていますが、

次に、それらの違いと落とし穴があるかどうかを見てみましょう。 [推奨される学習: MySQL ビデオ チュートリアル ]

count(*)、count(1)、および count(id) の違い

count の意味: count() は集計関数です。返された結果セットは行ごとに判定されます。count 関数のパラメータが NULL でない場合、累積値は 1 ずつ増加します。NULL でない場合、累積値は 1 ずつ増加します。追加されません。最後に、累積値が返されます。

count (field) は特別で、条件を満たすデータ行の総数を返すことを意味し、パラメータ「field」は NULL ではありません

#分析パフォーマンスの違いの原理

  • サーバー層に必要なものを何でも与えます;

  • #InnoDB は必要な値のみを与えます;

  • 現在のオプティマイザは、「行数を取得する」ために count(*) のセマンティクスを最適化するだけであり、他の「明らかな」最適化は行いません

例:

count (主キー ID)、InnoDB エンジンはテーブル全体を走査し、各行の ID 値を取り出してサーバー層に返します。サーバー層はidを取得すると空にはできないと判断し、一行ずつ蓄積していきます。

count(1)、InnoDB エンジンはテーブル全体を走査しますが、値は取得しません。サーバー層は返された各行に「1」を入れ、空にできないと判断した場合は行ごとに積み上げていきます。

count (フィールド)。サーバーがフィールドを必要とする場合、サーバーはフィールドを返します。フィールドが空の場合、統計は実行されません。フィールド値が大きすぎると、非効率が発生します。

#効率的な並べ替え

count(字段)<count(主键 id)<count(1)≈count(*)

##count(*) が最も速いのはなぜですか? オプティマイザはその仕事を実行し、走査する最小の数値を見つけます。

InnoDB はインデックス構成テーブルであり、主キー インデックス ツリーのリーフ ノードはデータですが、通常のインデックス ツリーのリーフ ノードは主キー値です。したがって、通常のインデックス ツリーは主キー インデックス ツリーよりもはるかに小さくなります。 count(*) などの操作の場合、どのインデックス ツリーを走査しても得られる結果は論理的に同じです。したがって、MySQL オプティマイザは、走査する最小のツリーを見つけます。ロジックが正しいことを前提として、スキャンされるデータの量を最小限に抑えることは、データベース システム設計の一般的なルールの 1 つです。

NULL に関するいくつかの落とし穴

// 数据中存在null值数据
select count(*) from audit_log a;
结果:1

select count(id) from audit_log a;
结果:0
count の結果が矛盾していることがわかります。レコード数は 1 であるはずですが、count( id) is not. Equal to 0これは、count (field) がカウントされず、フィールド値が null であるためです

したがって、フィールドが空でないフィールドの場合は、次のようにする必要があります。この問題を解決するには count(*) を使用してください。

count(*) の概要

MyISAM テーブル count(*) は高速ですが、トランザクションをサポートしていません;
  • show table status コマンドはすぐに戻りますが、正確ではありません;
  • InnoDB table direct count(*) はテーブル全体を走査します。結果は正確ですが、パフォーマンスの問題が発生する可能性があります。

以上がMySQL Count関数の使い方の違いまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。