Il peut être la meilleure solution. Obtenons d'abord d'autres réponses...
Que signifie EXPLAIN SELECT ...
dire? (Cela peut répondre à votre Q2).
Votre requête parcourra l'ensemble du tableau, quelles que soient les autres réponses. Peut-être voulez-vous LIMIT ...
à la fin ?
Une autre chose qui pourrait être utile (en fonction de votre application et de l'optimiseur) :ajoutez un cadre de délimitation à WHERE
clause.
Dans tous les cas, procédez comme suit pour avoir une idée précise du nombre de lignes réellement touchées :
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
Revenez avec ces réponses ; alors peut-être que nous pouvons itérer plus loin.
Après AFFICHER L'ÉTAT
Eh bien, Handler_read_rnd_next
dit qu'il s'agissait d'un balayage complet de la table. Le 1 000 et le 1 001 -- aviez-vous LIMIT 1000
?
J'en déduis que LIMIT
n'est pas pris en compte dans la façon dont SPATIAL
œuvres. Autrement dit, il fait la chose simpliste - (1) vérifie toutes les lignes, (2) trie, (3) LIMIT
.
Alors, que faire ?
Plan A :Décidez que vous ne voulez pas de résultats plus éloignés que X miles (km) et ajoutez un "cadre de délimitation" à la requête.
Plan B :Abandonnez Spatial et explorez une manière plus complexe de faire la tâche :http:// mysql.rjweb.org/doc.php/latlng