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 :https:// mysql.rjweb.org/doc.php/latlng