私自身、これが気になりました。ドキュメントと理論的な答えを読むのは問題ありませんが、私はそれらと経験的な証拠とのバランスを取るのが好きです.
5,607,997 レコードを含む MySQL テーブル (InnoDB) があります。テーブルは私用のプライベート サンドボックスにあるため、コンテンツが静的であり、他の誰もサーバーを使用していないことがわかっています。これにより、パフォーマンスへの外部からの影響がすべて効果的に取り除かれると思います。where 句のテスト (WHERE Id IS NOT NULL) に使用する、決して null にならないことがわかっている auto_increment 主キー フィールド (Id) を持つテーブルがあります。
テストの実行中に他に考えられる唯一の不具合は、キャッシュです。初めてクエリを実行すると、同じインデックスを使用する後続のクエリよりも常に遅くなります。以下では、これをキャッシュ シード呼び出しと呼びます。少し混乱させるために、データに関係なく常にtrueと評価されることがわかっているwhere句を使用して実行しました(TRUE = TRUE)。
ここに私の結果があります:
クエリの種類
| w/o WHERE | where id is not null | where true=true
カウント()
| 9 min 30.13 sec ++ | 6 min 16.68 sec ++ | 2 min 21.80 sec ++
| 6 min 13.34 sec | 1 min 36.02 sec | 2 min 0.11 sec
| 6 min 10.06 se | 1 min 33.47 sec | 1 min 50.54 sec
COUNT(ID)
| 5 min 59.87 sec | 1 min 34.47 sec | 2 min 3.96 sec
| 5 min 44.95 sec | 1 min 13.09 sec | 2 min 6.48 sec
カウント(1)
| 6 min 49.64 sec | 2 min 0.80 sec | 2 min 11.64 sec
| 6 min 31.64 sec | 1 min 41.19 sec | 1 min 43.51 sec
++これは、キャッシュの Seeding 呼び出しと見なされます。他のものよりも遅くなることが予想されます。
結果がすべてを物語っていると思います。COUNT(Id) は、通常、他よりも優れています。Where 句を追加すると、true と評価されることがわかっている句であっても、アクセス時間が大幅に短縮されます。スイート スポットは COUNT(Id)... WHERE Id IS NOT NULL のようです。
おそらく、より小さなテーブルや、カウントしているフィールドとは異なるフィールドに対する where 句を使用して、他の人々の結果を確認したいと思います。私が考慮していない他のバリエーションがあると確信しています。