2

まず、これはSQL では、count(column) と count(*) の違いは何ですか?という質問ではありません。.

主キーと、ユーザーが現在ログインしているかどうかを示す別のフィールドを持つusersテーブルがあるとします。user_idlogged_in

走り方に違いはありますか

SELECT COUNT(user_id) FROM users WHERE logged_in=1

SELECT COUNT(logged_in) FROM users WHERE logged_in=1

ログイン済みとしてマークされているユーザーの数を確認するには? 多分インデックスとの違い?

これにDB固有のニュアンスがある場合、MySQLを実行しています。

4

2 に答える 2

12

MySQL では、count 関数は null 式をカウントしないため、2 つのクエリの結果が異なる場合があります。コメントとRemusの回答で述べたように、これはSQLの一般的なルールであり、仕様の一部です。

たとえば、次のデータを考えてみましょう。

user_id   logged_in
1         1
null      1

SELECT COUNT(user_id)このテーブルの は 1 を返しますが、SELECT COUNT(logged_in)2 を返します。

実際問題として、テーブルが適切に構築されている限り、問題の例の結果は常に同じである必要がありますが、結果が同じであっても、使用されるインデックスとクエリ プランが異なる場合があります。さらに、これが単純化された例である場合、異なる列を当てにすると結果も変わる可能性があります。

この質問も参照してください: MySQL COUNT() and nulls

于 2013-01-17T21:13:17.777 に答える
5

記録のために:2つのクエリは異なる結果を返します。仕様が言うように:

SELECTステートメントによって取得された行のexprのNULL以外の値の数のカウントを返します。

logged_in=1NULLlogged_in行の条件が与えられた場合、とにかくフィルターで除外さuser_idれ、テーブルにNULLが含まれないと主張するかもしれませんusers。これは真実かもしれませんが、クエリが異なるという基本的なことは変わりません。上記のすべての論理的推論を行うようにクエリオプティマイザに要求しています。あなたにとっては明白かもしれませんが、オプティマイザにとってはそうではないかもしれません。

さて、結果が実際には常に2つの間で同一であると仮定すると、答えは簡単です。本番環境でそのようなクエリを実行しないでください(つまり、どちらかを意味します)。どのようにスライスしても、スキャンです。logged_inカーディナリティが低すぎて問題になりません。カウンターを保持し、ログインおよびログアウトイベントごとに更新します。時間の経過とともにドリフトし、必要に応じて何度でも更新します(1日1回、1時間に1回)。

質問自体に関しては、IOを少なくSELECT COUNT(somefield) FROM sometableするために狭いインデックスを使用できます。オプティマイザーが適切と思われるインデックスを使用するためのこの部屋somefieldを使用することをお勧めします(ただし、これは製品ごとに異なりますが、クエリオプティマイザーがどれだけ賢いかYMMVを扱っているかによって異なります)。しかし、WHERE句を追加し始めると、可能な代替(=使用するインデックス)はすぐに消えます。 *

于 2013-01-17T21:21:10.807 に答える