一般に、コストのCOUNT(*)
コストは、クエリ条件を満たすレコードの数と、これらのレコードの準備に必要な時間 (基になるクエリの複雑さに依存します) に比例します。
単一のテーブルを扱っている単純なケースでは、そのような操作を安価にするために、特定の最適化が行われていることがよくあります。たとえば、単一のテーブルから条件COUNT(*)
なしで実行すると、メタデータに保存されるため、これは瞬時に行われます。WHERE
MyISAM
MySQL
たとえば、次の 2 つのクエリを考えてみましょう。
SELECT COUNT(*)
FROM largeTableA a
すべてのレコードがクエリを満たすため、COUNT(*)
コストはテーブル内のレコード数に比例します (つまり、返されるものに比例します) (行を訪問する必要があり、それを処理するための特定の最適化が行われていないと仮定します)
SELECT COUNT(*)
FROM largeTableA a
JOIN largeTableB b
ON a.id = b.id
この場合、エンジンはおそらく使用HASH JOIN
し、実行計画は次のようになります。
- 小さい方のテーブルにハッシュ テーブルを作成する
- 大きなテーブルをスキャンし、ハッシュ テーブル内の各レコードを検索します
- 彼らが行くように一致を数えます。
この場合、COUNT(*)
オーバーヘッド (ステップ 3) は無視でき、クエリ時間はステップ 1 と 2、つまりハッシュ テーブルを作成して検索することで完全に定義されます。このようなクエリの場合、時間は次のようになりますO(a + b)
。実際には一致の数には依存しません。
a.id
ただし、との両方にインデックスがある場合はb.id
、MERGE JOIN
が選択される可能性があり、COUNT(*)
各一致の後にインデックス シークが実行されるため、時間は再び一致の数に比例します。