データベース統計行数、MySQLやOracleのいずれかについて、使用可能な機能を有しており、それはCOUNTです。
しかし、特にインタビューの中で、それが悪用されるだろうと信じて、この共通のCOUNT関数ですが、謎の多くを隠されました。以下、次の質問にお答えしようとすると、それを信じてはいけません。
1、COUNT有几种用法?
2、COUNT(字段名)和COUNT(*)的查询结果有什么不同?
3、COUNT(1)和COUNT(*)之间有什么不同?
4、COUNT(1)和COUNT(*)之间的效率哪个更高?
5、为什么《阿里巴巴Java开发手册》建议使用COUNT(*)
6、MySQL的MyISAM引擎对COUNT(*)做了哪些优化?
7、MySQL的InnoDB引擎对COUNT(*)做了哪些优化?
8、上面提到的MySQL对COUNT(*)做的优化,有一个关键的前提是什么?
9、SELECT COUNT(*) 的时候,加不加where条件有差别吗?
10、COUNT(*)、COUNT(1)和COUNT(字段名)的执行过程是怎样的?
以上の10個の質問あなたがすべて正確に答えることができれば、それはあなたが本当に理解して意味COUNT
の機能を。
1.知人COUNT
1、COUNT(expr)
NULLの数ではないexprの行の値を取得するためにSELECT文を返します。結果があるBIGINT
値。
クエリ結果は、すべてのレコードをヒットしなかった場合は2、0を返します。
図3は、しかし、ことは注目に値するCOUNT(*)
統計、NULL値を含む行の数。
加えてCOUNT(id)
とCOUNT(*)
外、また使用することができますCOUNT(常量)
(のようなCOUNT(1)
行の数をカウントする)、次の3つのSQLステートメントは、それがどのような違いを生むのでしょうか?最終的にはどちらがより効率的ですか?なぜ「アリ・ババのJava開発マニュアル」を使用していない必須COUNT(列名)
またはCOUNT(常量)
交換するためにCOUNT(*)
それを?
(*)2.COUNT(フィールド)、COUNT(定数)とCOUNTとの間の差
COUNT(常量)
そして、COUNT(*)
クエリを直接修飾されたデータベーステーブルの行数を表します。
そしてCOUNT(列名)
それは、クエリが列の値の資格行数のNULLではありません表します。
COUNT(*)
それは標準の構文なので、MySQLデータベースの最適化がたくさんあるので、構文は、行SQL92標準的な統計の定義の数です。
SQL92、ANSI / ISO標準のデータベース。これは、言語(SQL)データベースと行動(トランザクションの分離レベル、など)を定義します。
3.COUNT(*)の最適化
MySQL
実行エンジンの2種類の主な用途:
- InnoDBエンジン
- MyISAMエンジン
MyISAMテーブルは、トランザクションをサポートしていない、MyISAMテーブル・レベルのロックがロック中であり、InnoDBはトランザクションをサポートし、行レベルのロックをサポートします。
MyISAMテーブル
MyISAMテーブルは、実行があれば、テーブルの行数が別々に記録、簡単な最適化を行ったcount(*)
直接返すことができ、前提はどこ条件はありません。MyISAMテーブルは、テーブルレベルロック、ラインのない同時動作であるので、結果が正確であることが判明しました。
InnoDBの
サポートサービスは、ほとんどの操作は、行レベルのロックであるため、InnoDBは、このキャッシュ動作を使用することができない、平行線を変更することができる、キャッシュレコードは正確ではありません。
しかし、InnoDBのか、COUNT(*)文には、いくつかの最適化を行いました。
テーブルインデックスは、テーブルの具体的内容に焦点を当てるのではなく、低コストによって捕捉されます。
リーフノードクラスタ化インデックスに格納されたクラスタ化インデックスに保存のInnoDBインデックス(主キーインデックス)および非クラスタ化インデックス(非プライマリ・キー・インデックス)は、クラスタ化インデックスのリーフ・ノードであるのではなく、行全体であります行の主キーの値。
MySQLは、テーブルを掃除するために最小の非クラスタ化インデックスを優先させて頂きます。
条件によって条件やグループが含まれていない前提でのクエリの最適化。
4.COUNT(*)和COUNT(1)
言いたいことがMySQLの公式ドキュメント:
InnoDBはSELECT COUNT(*)およびSELECT COUNT(1)同様に操作を処理します。何のパフォーマンスの違いはありません。
だから、のためにcount(1)
とcount(*)
、MySQLの最適化は、単に速く存在していない人は、まったく同じです!
しかし、まだそれはお勧めcount(*)
、これは行SQL92標準的な統計の定義の数の構文であるとして、。
5.COUNT(フィールド)
全表スキャンは、それが決定されたかどうかを指定したフィールドの値NULL
ではなく、NULL
蓄積。
性能比count(1)
とcount(*)
遅くなります。
6.まとめ
COUNT
主テーブルの行数の機能の使用。主な用途はCOUNT(*)
、COUNT(字段)
とCOUNT(1)
。
なぜならCOUNT(*)
、彼はMySQLの最適化がたくさんあったので、行SQL92標準的な統計の定義の数の構文は、MyISAMテーブルは、別途記録されたテーブルの行数に直接になりますCOUNT(*)
クエリ掃引するとき、InnoDBはテーブルの中で最小のインデックスを選択しますコストを削減します。もちろん、これらの最適化の前提はどこのグループ条件との問い合わせではありません。
InnoDBのではCOUNT(*)
とCOUNT(1)
の違い、および同じ効率を実現しなかったが、COUNT(字段)
非NULLフィールドの判断を必要とする、効率が低くなります。
のでCOUNT(*)
SQL92に定義された標準的な統計ライン構文の数、および高効率なので、直接お使いくださいCOUNT(*)
ルックアップテーブル内の行数を!