Es kann die beste Lösung sein. Lass uns zuerst ein paar andere Antworten bekommen...
Was bedeutet EXPLAIN SELECT ...
sagen? (Dies könnte Ihre Frage 2 beantworten).
Ihre Abfrage durchsucht die gesamte Tabelle, unabhängig von den anderen Antworten. Vielleicht möchten Sie LIMIT ...
am Ende?
Eine andere Sache, die nützlich sein könnte (abhängig von Ihrer App und dem Optimizer):Fügen Sie dem WHERE
einen Begrenzungsrahmen hinzu Klausel.
Gehen Sie in jedem Fall wie folgt vor, um ein genaues Gefühl dafür zu bekommen, wie viele Zeilen tatsächlich berührt werden:
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
Kommen Sie mit diesen Antworten zurück; dann können wir vielleicht weiter iterieren.
Nach STATUS ANZEIGEN
Nun, Handler_read_rnd_next
sagt, dass es sich um einen vollständigen Tabellenscan handelte. Die 1000 und 1001 – hatten Sie LIMIT 1000
?
Daraus leite ich dieses LIMIT
ab wird nicht berücksichtigt, wie SPATIAL
funktioniert. Das heißt, es macht das Vereinfachte -- (1) alle Zeilen prüfen, (2) sortieren, (3) LIMIT
.
Also, was tun?
Plan A:Entscheiden Sie, dass Sie keine Ergebnisse wünschen, die weiter als X Meilen (km) entfernt sind, und fügen Sie der Abfrage einen "Begrenzungsrahmen" hinzu.
Plan B:Geben Sie Spatial auf und suchen Sie nach einem komplexeren Weg, um die Aufgabe zu erledigen:http:// mysql.rjweb.org/doc.php/latlng