Att beräkna avståndet med den funktionen där är ganska beräkningsmässigt dyrt, eftersom det involverar en hel massa transcendentala funktioner. Detta kommer att bli problematiskt när du har ett stort antal rader att filtrera på.
Här är ett alternativ, en uppskattning som är mycket billigare beräkningsmässigt:
Ungefärligt avstånd i miles:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 53.0 * (lon2 - lon1)
Du kan förbättra noggrannheten i den här ungefärliga avståndsberäkningen genom att lägga till matematisk cosinusfunktion:
Förbättrat ungefärligt avstånd i miles:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
Källa:http://www.meridianworlddata.com/Distance-Calculation.asp
Jag körde ett gäng tester med slumpmässigt genererade datauppsättningar.
- Skillnaden i noggrannhet för de tre algoritmerna är minimal , särskilt på korta avstånd
- Den långsammaste algoritmen är naturligtvis den med triggfunktionerna (den på din fråga). Den är 4 gånger långsammare än de andra två.
Absolut inte värt det. Gå bara med en uppskattning.
Koden finns här:http://pastebin.org/424186
För att använda detta på MySQL, skapa en lagrad procedur som tar koordinatargument och returnerar avståndet, då kan du göra något som:
SELECT columns
FROM table
WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25