Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL verwendet den Index nicht mehr, wenn zusätzliche Einschränkungen hinzugefügt werden

Das ist etwas schwierig zu erklären.

Die Abfrage, die den Index verwendet, verwendet ihn, weil der Index ein „abdeckender“ Index ist. Das heißt, alle Spalten im Index sind in der Abfrage enthalten. Der einzige Teil des Index, der wirklich effektiv genutzt wird, ist die Bedingung für latitude .

Normalerweise hätte ein abdeckender Index nur die in der Abfrage erwähnten Spalten. Der Primärschlüssel wird jedoch verwendet, um auf die Datensätze zu verweisen, also vermute ich, dass users.Id ist der Primärschlüssel auf der Tabelle. Und der Index wird nach gültigen Werten für latitude durchsucht .

Die Abfrage, die den Index nicht verwendet, verwendet ihn aus zwei Gründen nicht. Erstens sind die Bedingungen in den Spalten Ungleichungen. Eine Indexsuche kann nur Gleichheitsbedingungen und eine Ungleichheit verwenden. Das bedeutet, dass der Index nur für latitude verwendet werden konnte in seiner effektivsten Methode. Zweitens erfordern die zusätzlichen Spalten in der Abfrage sowieso den Wechsel zur Datenseite.

Mit anderen Worten, der Optimierer sagt im Grunde:„Warum sich die Mühe machen, zum Index zu gehen, um den Index zu durchsuchen und dann die Datenseiten zu scannen? Stattdessen kann ich einfach die Datenseiten scannen und alles auf einmal abrufen.“

Ihre nächste Frage lautet zweifellos:„Aber wie mache ich meine Abfrage schneller?“ Mein Vorschlag wäre, räumliche Indizes .