Vous devez stocker les points dans une seule colonne de type de données Point
que vous pouvez indexer avec un SPATIAL
index (si votre type de table est 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
Cela améliorera considérablement la vitesse des requêtes telles que "trouver tout dans un rayon donné".
Notez qu'il est préférable d'utiliser simplement TM
coordonnées métriques (est et nord) au lieu de polaires (latitude et longitude). Pour les petits rayons, ils sont suffisamment précis et les calculs sont grandement simplifiés. Si tous vos points se trouvent dans un hémisphère et sont éloignés des pôles, vous pouvez utiliser un seul méridien central.
Vous pouvez toujours utiliser les coordonnées polaires bien sûr, mais les formules pour calculer le MBR
et la distance sera plus complexe.