データベース内の行数に関しては、MySQL と Oracle の両方に COUNT という関数を使用できます。 しかし、このよく使われる COUNT 関数には、特に就職面接のときに多くの謎が隠されており、注意しないと簡単に悪用される可能性があります。信じられないなら、次の質問に答えてみてください。 > 1. 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 データベースは大幅に最適化されています。
3. COUNT(*)の最適化MySQL は主に 2 つの実行エンジンを使用します。
MyISAM はトランザクションをサポートしておらず、MyISAM のロックはテーブル レベルのロックです。一方、InnoDB はトランザクションと行レベルのロックをサポートしています。 マイISAMMyISAM は、テーブル内の行の合計数を個別に記録するという単純な最適化を行っています。count(*) を実行すると、where 条件がない限り、直接返すことができます。 MyISAM はテーブルレベルのロックを使用し、同時行操作は行われないため、結果は正確です。 翻訳InnoDB はトランザクションをサポートしており、ほとんどの操作は行レベルのロックであるため、この種のキャッシュ操作は使用できません。行は並行して変更される可能性があるため、キャッシュ レコードは不正確になります。 ただし、InnoDB では COUNT(*) ステートメントに対していくつかの最適化が行われています。 テーブルの特定の内容に注意を払わずに、低コストのインデックスを通じてテーブルをスキャンします。 InnoDB のインデックスは、クラスター化インデックス (主キー インデックス) と非クラスター化インデックス (非主キー インデックス) に分かれています。クラスター化インデックスのリーフ ノードにはレコードの行全体が格納され、非クラスター化インデックスのリーフ ノードにはレコードの行の主キー値が格納されます。 MySQL は、テーブルをスキャンするために、最小の非クラスター化インデックスを選択することを優先します。 最適化の前提は、クエリ ステートメントに where 条件と group by 条件が含まれていないことです。 4. COUNT(*) と COUNT(1)MySQL の公式ドキュメントには次のように書かれています:
したがって、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をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
目次1. Vue環境を構築する2. Vue スキャフォールディングツール3. プロジェクトを作成する...
1. この記事で実装した効果図は以下のとおりです。レイアウトの右側に Flex レイアウトを使用し、...
この記事では、Web デザインの達人がよく使用するレスポンシブ フレームワーク (概要) を紹介し、...
序文指定した文字による結合または分割は一般的なシナリオです。MySQL では結合の記述は比較的簡単で...
目次ブラウザのレンダリングメカニズムリフローと再塗装リフロー逆流を引き起こす行為:再描画再描画を引き...
目次序文必要成し遂げる最初のレンダリングメニュー項目をクリックしますスタイルの区別デフォルトのハイラ...
基本概念絶対配置: 絶対配置に設定された要素ボックスはドキュメント フローから完全に削除され、その包...
CSS は div にスクロールを追加し、スクロール バーを非表示にします。具体的なコードは次のとお...
多くの人が MySQL の起動時にこのエラーに遭遇しています。まず、このエラーの前提は、サービス ス...
目次1. シンプルなページの例2.uni-appはvueコンポーネントとミニプログラムネイティブコン...
シンプルなアプリケーションの展開1. ディレクトリ構造: └── Pythonpro #ディレクトリ...
目次1. ヘルプ情報を使用する2. データベースの作成、削除、表示3. データベースに接続する4. ...
序文:ストレージ エンジンはデータベースの中核です。MySQL の場合、ストレージ エンジンはプラグ...
目次1. ソースコード1.1 モノレポ1.2 タイプスクリプト2. パフォーマンス2.1 ソースコー...
目次1. ソフトウェアパッケージ2. gccをインストールする3. libfastcommonをイン...