Debe almacenar los puntos en una sola columna de tipo de datos Point
que puede indexar con un SPATIAL
índice (si su tipo de tabla es 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
Esto mejorará drásticamente la velocidad de consultas como "buscar todo dentro de un radio dado".
Tenga en cuenta que es mejor usar simple TM
coordenadas métricas (este y norte) en lugar de polares (latitud y longitud). Para radios pequeños, son lo suficientemente precisos y los cálculos se simplifican enormemente. Si todos tus puntos están en un hemisferio y están lejos de los polos, puedes usar un solo meridiano central.
Todavía puedes usar coordenadas polares, por supuesto, pero las fórmulas para calcular el MBR
y la distancia será más compleja.