いいえ。これは、構文間の混乱に基づく、永続的な誤解のようです。
SELECT * FROM ...
と
SELECT COUNT(*) FROM ...
最初のケースで*
は、すべての列を参照し、それらを返すには、単一の列を返すよりも多くのリソースが必要です。2 番目のケースでCOUNT(*)
は、単に「すべての行をカウントする」の省略形です。COUNT(*)
1 つの列だけを調べる必要があるのに、データベース エンジンにすべての行のすべての列を調べるように何らかの方法で指示するというのは、誤った信念ですCOUNT(<pk_field>)
。
ここでは、SQL-92 標準を参照する SO に関する他のコメントが多数ありますCOUNT(*)
。これは、テーブルのカーディナリティのみを参照する必要があることを明示的に示しているため、少なくとも理論的には、データベース エンジンはそれを認識して最適化できるはずです。
私が知る限り、どちらの場合も、ほとんどのデータベース エンジン ( Postgres、Oracle、MySQL InnoDB ) はインデックス スキャンを実行して行数をカウントします。PK を指定すると、そのインデックスが使用されます。を使用するだけの場合COUNT(*)
、クエリプランナーはテーブル全体にまたがるインデックスを選択します*が、パフォーマンスは同じである必要があります。
これに対する唯一の例外は、MyISAM テーブルを使用する MySQL です。これらのテーブルは行数をキャッシュするため、COUNT(*)
非常に高速です。ただし、クエリ プランナーはCOUNT(<field>)
、ここで<field>
は null 以外の列を、テーブル全体のサイズに対する要求として認識し、その場合もキャッシュを使用します。(ソース) 繰り返しますが、パフォーマンスに違いはありません。
* 理論的には、そのようなインデックスがなけれCOUNT(*)
ば非常に遅くなりますが、その場合はCOUNT(<pk>)
定義上不可能です