2012-04-20 2 views
0

テーブルチームには1169個の行が含まれており、1133にはUserIdフィールド!= 0が含まれています。クエリはすべての行を検討する必要があるのはなぜ1133なぜカウントを選択すると、多くの行がフェッチされるのですか?

に等しい検討する行の推定値を持つ

EXPLAIN SELECT count(*) FROM teams WHERE UserId != 0

戻っ出力:

クエリ「ユーザーID」フィールドにインデックスがあります?この目的のためにインデックスを使うべきではありませんか?

ありがとうございます。

+2

あなたはSELECT COUNT(UserID)を試しましたか? – Hajo

+0

インデックスエントリの数ではありませんか?クラスタ化されたインデックスを覚えていれば、テーブルはインデックスです。 – Ben

答えて

1

UserId!= 0と言っているので、ほぼすべての行が必要なため、ほぼすべての行が調べられます。確かに、あなたは「カウント」をして1つのレコードしか表示しないようにしますが、カウントするためにはすべてそれらをフェッチしなければなりませんでした。 (!= YYをUSERIDとは対照的に、ユーザーID = XX)あなたが正確な値を求めているので、 あなたは

select count(1) from teams where UserId = 100 

を行う場合には、それは、数行ONY検討します。

+1

ああ、そうだね...ありがとう。 – Budda

+0

しかし、なぜ使用されたCOUNT(1)?それはCOUNT(*)とどう違うのですか? – Budda

+0

@Budda以前の*では*を使用すると、行構造体全体をフェッチしてカウントしたので、count(任意の定数)を使用するとそれを回避できます。これはおそらく現在のDBMSのケースではないでしょうが、私は習慣を持っています。いずれにしても、私の回答のimportatは、 "UserId!= xx"ではなく "UserId = xx"です。私は明確にするために応答を編集します。 –

関連する問題