Dovresti memorizzare i punti in una singola colonna di tipo di dati Point
che puoi indicizzare con un SPATIAL
index (se il tipo di tabella è 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
Ciò migliorerà drasticamente la velocità di query come "trova tutto entro un determinato raggio".
Nota che è meglio usare semplice TM
coordinate metriche (est e nord) anziché polari (latitudine e longitudine). Per piccoli raggi, sono sufficientemente accurati e i calcoli sono notevolmente semplificati. Se tutti i tuoi punti sono in un emisfero e sono lontani dai poli, puoi utilizzare un unico meridiano centrale.
Puoi ancora usare le coordinate polari ovviamente, ma le formule per calcolare il MBR
e la distanza sarà più complessa.