Powinieneś przechowywać punkty w pojedynczej kolumnie typu danych Point
które możesz zaindeksować za pomocą SPATIAL
indeks (jeśli typ tabeli to 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
To radykalnie poprawi szybkość zapytań, takich jak „znajdź wszystko w danym promieniu”.
Pamiętaj, że lepiej jest używać zwykłego TM
współrzędne metryczne (wschodnia i północna) zamiast bieguna (szerokość i długość geograficzna). Dla małych promieni są one wystarczająco dokładne, a obliczenia są znacznie uproszczone. Jeśli wszystkie twoje punkty znajdują się na jednym półkuli i są daleko od biegunów, możesz użyć jednego południka centralnego.
Oczywiście nadal możesz używać współrzędnych biegunowych, ale wzory do obliczania MBR
a odległość będzie bardziej złożona.