sql >> データベース >  >> RDS >> Mysql

追加の制約が追加されると、MySQLはインデックスの使用を停止します

    これを説明するのは少し難しいです。

    インデックスは「カバーする」インデックスであるため、インデックスを使用するクエリはそれを使用しています。つまり、インデックス内のすべての列がクエリに含まれています。実際に効果的に使用されているインデックスの唯一の部分は、latitudeの条件です。 。

    通常、カバーするインデックスにはのみがあります クエリで言及されている列。ただし、主キーはレコードを参照するために使用されるため、users.Idだと思います。 テーブルの主キーです。そして、インデックスはlatitudeの有効な値についてスキャンされています 。

    インデックスを使用していないクエリは、2つの理由でインデックスを使用していません。まず、列の条件は不等式です。インデックスシークは、等式条件と1つの不等式のみを使用できます。つまり、インデックスはlatitudeにのみ使用できます。 その最も効果的な方法で。次に、クエリの追加の列は、とにかくデータページに移動する必要があります。

    言い換えると、オプティマイザーは、事実上、「インデックスに移動してインデックスをスキャンしてからデータページをスキャンするのはなぜですか?代わりに、データページをスキャンしてすべてを一度に取得できます」と言っています。

    次の質問は間違いなく「しかし、どうすればクエリを高速化できますか?」です。私の提案は、空間インデックス> 。




    1. Firebase:外部DBから読み取る方法は?

    2. M1 Mac(ARM64)にSQLServerをインストールする方法

    3. 本番環境でのPostgresクエリにより、ディスク読み取りI/Oが異常に高くなります

    4. MySQLテーブルの欠落している値を補間します