Você deve armazenar os pontos em uma única coluna do tipo de dados
Point
que você pode indexar com um SPATIAL
index (se o seu tipo de tabela for 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
Isso melhorará drasticamente a velocidade de consultas como "encontrar tudo dentro de um determinado raio".
Observe que é melhor usar
TM
simples coordenadas métricas (leste e norte) em vez de polares (latitude e longitude). Para raios pequenos, eles são precisos o suficiente e os cálculos são bastante simplificados. Se todos os seus pontos estiverem em um hemisfério e longe dos pólos, você pode usar um único meridiano central. Você ainda pode usar coordenadas polares, é claro, mas as fórmulas para calcular o
MBR
e a distância será mais complexa.