Du bör lagra poängen i en kolumn av datatypen Point
som du kan indexera med en SPATIAL
index (om din tabelltyp är MyISAM
):
CREATE SPATIAL INDEX sx_place_location ON place (location)
SELECT *
FROM mytable
WHERE MBRContains
(
LineString
(
Point($x - $radius, $y - $radius),
Point($x + $radius, $y + $radius)
)
location
)
AND Distance(Point($x, $y), location) <= $radius
Detta kommer att drastiskt förbättra hastigheten på frågor som "hitta alla inom en given radie".
Observera att det är bättre att använda vanlig TM
metriska koordinater (östlig och nordlig) istället för polär (latitud och longitud). För små radier är de tillräckligt noggranna, och beräkningarna förenklas avsevärt. Om alla dina punkter är i ett halvklot och är långt från polerna, kan du använda en enda central meridian.
Du kan naturligtvis fortfarande använda polära koordinater, men formlerna för att beräkna MBR
och avståndet blir mer komplext.