Pas un MySql de réponse précise, mais ça va améliorer les performances de votre instruction sql.
Ce que vous êtes effectivement en train de faire est de calculer la distance de chaque point du tableau, pour voir si elle est dans les 10 unités d'un point donné.
Ce que vous pouvez faire avant de l'exécuter sql, c'est de créer quatre points de dessiner une boîte de 20 unités sur un côté, avec votre point dans le centre-je.e.. (x1,y1 ) . . . (x4, y4), où (x1,y1) est (givenlong + de 10 unités, givenLat + 10units) . . . (givenLong - 10units, givenLat -10 unités).
En fait, vous avez seulement besoin de deux points, en haut à gauche et en bas à droite de les appeler (X1, Y1) et (X2, Y2)
Maintenant, votre instruction SQL utiliser ces points pour exclure les lignes qui sont certainement plus de 10u à partir de votre point donné, il peut utiliser des index sur les latitudes et les longitudes, de sorte que sera ordres de grandeur plus rapide que ce que vous avez actuellement.
par exemple
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
La boîte approche peut retourner faux positifs (vous pouvez prendre des points dans les coins de la boîte qui sont > 10u à partir de ce point), si vous avez encore besoin de calculer la distance de chaque point. Cependant, ce nouveau sera beaucoup plus rapide parce que vous avez considérablement limité le nombre de points de test pour les points à l'intérieur de la boîte.
J'appelle cette technique "de la Pensée à l'intérieur de la boîte" :)
EDIT: cela Peut-il être mis dans une instruction SQL?
Je n'ai aucune idée de ce que mySql ou Php est capable de faire, désolé.
Je ne sais pas où est le meilleur endroit est de construire les quatre points, ou comment ils pourraient être transmis à une requête mySql en Php. Cependant, une fois que vous avez les quatre points, il n'y a rien qui vous empêche de combiner votre propre SQL confession avec la mienne.
select name,
( 3959 * acos( cos( radians(42.290763) )
* cos( radians( locations.lat ) )
* cos( radians( locations.lng ) - radians(-71.35368) )
+ sin( radians(42.290763) )
* sin( radians( locations.lat ) ) ) ) AS distance
from locations
where active = 1
and locations.lat between X1 and X2
and locations.Long between y1 and y2
having distance < 10 ORDER BY distance;
Je sais avec MS SQL, je peux créer une instruction SQL qui déclare quatre chars (X1, Y1, X2, Y2) et calcule avant le "principal" instruction select, comme je l'ai dit, je n'ai aucune idée si cela peut être fait avec MySql. Cependant, je serais toujours enclins à construire les quatre points de C# et de les passer en paramètres à la requête SQL.
Désolé je ne peux pas être plus d'aide, si quelqu'un peut répondre à l'MySQL & Php certaines parties de cette, n'hésitez pas à modifier cette réponse à faire.