記録のために:2つのクエリは異なる結果を返します。仕様が言うように:
SELECTステートメントによって取得された行のexprのNULL以外の値の数のカウントを返します。
logged_in=1
NULLlogged_in
行の条件が与えられた場合、とにかくフィルターで除外さuser_id
れ、テーブルにNULLが含まれないと主張するかもしれませんusers
。これは真実かもしれませんが、クエリが異なるという基本的なことは変わりません。上記のすべての論理的推論を行うようにクエリオプティマイザに要求しています。あなたにとっては明白かもしれませんが、オプティマイザにとってはそうではないかもしれません。
さて、結果が実際には常に2つの間で同一であると仮定すると、答えは簡単です。本番環境でそのようなクエリを実行しないでください(つまり、どちらかを意味します)。どのようにスライスしても、スキャンです。logged_in
カーディナリティが低すぎて問題になりません。カウンターを保持し、ログインおよびログアウトイベントごとに更新します。時間の経過とともにドリフトし、必要に応じて何度でも更新します(1日1回、1時間に1回)。
質問自体に関しては、IOを少なくSELECT COUNT(somefield) FROM sometable
するために狭いインデックスを使用できます。オプティマイザーが適切と思われるインデックスを使用するためのこの部屋somefield
を使用することをお勧めします(ただし、これは製品ごとに異なりますが、クエリオプティマイザーがどれだけ賢いかYMMVを扱っているかによって異なります)。しかし、WHERE句を追加し始めると、可能な代替(=使用するインデックス)はすぐに消えます。 *