MySQL の count(1) と count(*) では、どちらのパフォーマンスが優れていますか?

        特定のテーブルのデータをカウントする必要がある場合、通常は count(1)、count(*)、または count(field) を使用しますが、これら 3 つの方法のうち、カウント効率が最も高いのはどれですか? 最初に結論について話しましょう。

カウント (1) = カウント (*) > カウント (フィールド)

なぜ上記の結論が得られるのか、簡単な説明を次に示します。

1.count(フィールド)の実行過程

        count() は集計関数です. 集計関数には null 値が集計関数の計算に参加しないという特徴があります. 関数のパラメーターは、フィールド名だけでなく、他の式にすることもできます。count(name) を使用する場合、名前フィールドは式であり、最下層は名前フィールドが NULL でないレコードをカウントします。つまり、フル テーブル スキャンが実行されます。名前が null でない場合、変数 count + 1 が追加されます。

2. count(1)の実行過程

        count(1) を使用する場合、関数のパラメーターは 1 に固定され、null になることはないため、レコードが読み取られる限り、count 変数は +1 になります。count(1) は count(field) よりも 1 ステップ少ない、つまり、フィールドの値を読み取る必要がないことがわかります。したがって、一般的に言えば、count(1) の実行効率は count(field) よりも高速です。 (フィールド) .

3. count(*)の実行過程

        * を見ると、すべてのフィールドの値が読み取られると考えがちですが、そうではありません。下図の実行記録からわかるように、count(*) は count(0) に相当します。つまり、count(*) を使用すると、MySQL は処理のために * パラメータをパラメータ 0 に変換します。

 したがって、count(1) と count(*) の実行プロセスは基本的に同じであり、パフォーマンスに違いはありません。

結論は:

  • 通常の開発プロセスではカウント (フィールド) を使用しないようにしてください --> 最下層はテーブル全体をスキャンして、null でないフィールドの数をカウントします
  • count(1) と count(*) の実行効率は同じ --> count(*) の最下層はすべてのフィールドを読み取るのではなく、count(0) を実行します

おすすめ

転載: blog.csdn.net/m0_70619994/article/details/130041142