Трябва да съхранявате точките в една колона с тип данни Point
които можете да индексирате с SPATIAL
индекс (ако вашият тип таблица е 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
Това драстично ще подобри скоростта на заявки като "намерете всички в даден радиус".
Имайте предвид, че е по-добре да използвате обикновен TM
метрични координати (изток и север) вместо полярни (ширина и дължина). За малки радиуси те са достатъчно точни и изчисленията са значително опростени. Ако всичките ви точки са в една полусфера и са далеч от полюсите, можете да използвате един централен меридиан.
Все още можете да използвате полярни координати, разбира се, но формулите за изчисляване на MBR
и разстоянието ще бъде по-сложно.