może być najlepszym rozwiązaniem. Najpierw zdobądźmy inne odpowiedzi...
Co oznacza EXPLAIN SELECT ...
mówić? (To może być odpowiedzią na twoje drugie pytanie).
Twoje zapytanie przeskanuje całą tabelę, niezależnie od innych odpowiedzi. Być może chcesz LIMIT ...
na końcu?
Kolejna rzecz, która może być przydatna (w zależności od aplikacji i Optymalizatora):Dodaj ramkę ograniczającą do WHERE
klauzula.
W każdym razie wykonaj następujące czynności, aby dokładnie określić, ile wierszy zostało faktycznie dotkniętych:
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
Wróć z tymi odpowiedziami; wtedy być może będziemy mogli kontynuować iterację.
Po POKAŻ STATUS
Cóż, Handler_read_rnd_next
mówi, że był to pełny skan tabeli. 1000 i 1001 -- czy masz LIMIT 1000
?
Domyślam się, że LIMIT
nie jest brane pod uwagę w jaki sposób SPATIAL
Pracuje. Oznacza to, że jest to uproszczona rzecz -- (1) sprawdzanie wszystkich wierszy, (2) sortowanie, (3) LIMIT
.
Więc co robić?
Plan A:Zdecyduj, że nie chcesz otrzymywać wyników dalej niż X mil (km) i dodaj „ramkę ograniczającą” do zapytania.
Plan B:Porzuć Spatial i przejdź do bardziej złożonego sposobu wykonania zadania:http:// mysql.rjweb.org/doc.php/latlng