これを説明するのは少し難しいです。
インデックスは「カバーする」インデックスであるため、インデックスを使用するクエリはそれを使用しています。つまり、インデックス内のすべての列がクエリに含まれています。実際に効果的に使用されているインデックスの唯一の部分は、latitude
の条件です。 。
通常、カバーするインデックスにはのみがあります クエリで言及されている列。ただし、主キーはレコードを参照するために使用されるため、users.Id
だと思います。 テーブルの主キーです。そして、インデックスはlatitude
の有効な値についてスキャンされています 。
インデックスを使用していないクエリは、2つの理由でインデックスを使用していません。まず、列の条件は不等式です。インデックスシークは、等式条件と1つの不等式のみを使用できます。つまり、インデックスはlatitude
にのみ使用できます。 その最も効果的な方法で。次に、クエリの追加の列は、とにかくデータページに移動する必要があります。
言い換えると、オプティマイザーは、事実上、「インデックスに移動してインデックスをスキャンしてからデータページをスキャンするのはなぜですか?代わりに、データページをスキャンしてすべてを一度に取得できます」と言っています。
次の質問は間違いなく「しかし、どうすればクエリを高速化できますか?」です。私の提案は、空間インデックス> 。