web-dev-qa-db-ja.com

MySQLでのCOUNT(id)とCOUNT(*)の比較

テーブルにプライマリフィールド 'id'(速度など)があると仮定して、次のクエリに違いはありますか?

SELECT COUNT(id) 
  FROM table

vs.

SELECT COUNT(*) 
  FROM table
23
James Simpson

Www.mysqlperformanceblog.comで Count(*)vs Count(col) を確認してください。彼らは、さまざまな「col」タイプ(NOT NULLかどうか、インデックスなど)についてこのトピックについて説明しています。 MyISAMおよびInnoDBテーブル用。

20
Pascal Thivent

私はMySQLに関する質問を知っていますが、それだけの価値があるため、Oracleにはcount(*)をお勧めします。これはデータベース固有であることを示します(上記のBalusCのコメントを参照)。多くのデータベース(MS-SQL、MySQL)には、さまざまなタイプのメタデータを保持する情報スキーマテーブルがあるため、1つの構文がすぐに利用できる値を単に検索し、別の構文がテーブルに直接行く場合、違いが生じることがあります。 。 1日の終わりに:さまざまなオプションを試して、EXPLAINが裏で起こっていることを教えてください。

2
davek

InnoDBでは行数がキャッシュされないため、COUNT(*)はCOUNT(ID)よりも低速です。

一方、MyISAMを使用すると、MyISAMが行数を維持するため、count(*)クエリはより高速になり、すぐに結果を返します。

MyISAMはテーブルレベルのロックを行うため、常に1つのトランザクションしか実行されないため、MyISAMが行数を維持するのは簡単です。トランザクションがコミットした後、次のトランザクションが開始する前に、MyISAMがテーブルの行数を(トランザクションによって実行される挿入と削除を考慮して)更新するのは簡単です。

ただし、行レベルのロックを使用するInnoDBでは、複数の並行して実行されている(まだコミットされていない)トランザクションがあります。一貫性を確保するために、各トランザクションは、トランザクション開始時のテーブル(テーブル内の行数を含む)に加えて、独自の変更を確認する必要があります。したがって、テーブル内の行数は、並行トランザクションごとに明らかに異なる可能性があります。したがって、(実行中の更新トランザクションがない場合を除いて)常に単一の「正しい」行の総数はありません。複数の同時トランザクションでは、テーブルの行の総数をキャッシュすることは実際には不可能です。

2
Satakshi Pandey

Count(*)Count(Ename)EnameはNot null制約のある列ではなく、カウントされていないいくつかのnull値があるため、差分出力を表示できます。

それが役に立てば幸い..!

0
Guguzz