Det kan vara den bästa lösningen. Låt oss få några andra svar först...
Vad betyder EXPLAIN SELECT ...
säga? (Detta kan ge svar på din Q2).
Din fråga kommer att skanna hela tabellen, oavsett de andra svaren. Du kanske vill ha LIMIT ...
på slutet?
En annan sak som kan vara användbar (beroende på din app och på Optimizern):Lägg till en begränsningsruta i WHERE
klausul.
Gör i alla fall följande för att få en exakt känsla för hur många rader som faktiskt rörs:
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
Återkom med de svaren; då kanske vi kan iterera vidare.
Efter VISA STATUS
Nåväl, Handler_read_rnd_next
säger att det var en fullbordsskanning. 1000 och 1001 -- hade du LIMIT 1000
?
Jag härleder att LIMIT
tas inte med i hur SPATIAL
Arbetar. Det vill säga, det gör det förenklade -- (1) kontrollera alla rader, (2) sortera, (3) LIMIT
.
Så, vad ska man göra?
Plan A:Bestäm att du inte vill ha resultat längre än X miles (km) och lägg till en "avgränsande ruta" i frågan.
Plan B:Överge Spatial och gräv ner i ett mer komplext sätt att utföra uppgiften:http:// mysql.rjweb.org/doc.php/latlng