Ele pode ser a melhor solução. Vamos obter algumas outras respostas primeiro...
O que
EXPLAIN SELECT ...
dizer? (Isso pode responder ao seu Q2). Sua consulta examinará toda a tabela, independentemente das outras respostas. Talvez você queira
LIMIT ...
no fim? Outra coisa que pode ser útil (dependendo do seu aplicativo e do Optimizer):Adicione uma caixa delimitadora ao
WHERE
cláusula. De qualquer forma, faça o seguinte para ter uma noção precisa de quantas linhas são realmente tocadas:
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
Volte com essas respostas; então talvez possamos iterar ainda mais.
Após MOSTRAR STATUS
Bem,
Handler_read_rnd_next
diz que foi uma varredura completa da tabela. Os 1000 e 1001 -- você tinha LIMIT 1000
? Deduzo que
LIMIT
não é fatorado em como SPATIAL
funciona. Ou seja, ele faz a coisa simplista -- (1) verifica todas as linhas, (2) classifica, (3) LIMIT
. Então o que fazer?
Plano A:decida que você não deseja resultados com mais de X milhas (km) e adicione uma "caixa delimitadora" à consulta.
Plano B:Abandone o Spatial e explore uma maneira mais complexa de realizar a tarefa:http:// mysql.rjweb.org/doc.php/latlng