Du bør gemme punkterne i en enkelt kolonne af datatypen Point
som du kan indeksere med en SPATIAL
indeks (hvis din tabeltype er 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
Dette vil drastisk forbedre hastigheden af forespørgsler som "find alle inden for en given radius".
Bemærk, at det er bedre at bruge almindelig TM
metriske koordinater (østlig og nordlig) i stedet for polar (bredde- og længdegrad). For små radier er de nøjagtige nok, og beregningerne er meget forenklet. Hvis alle dine punkter er i en halvkugle og er langt fra polerne, kan du bruge en enkelt central meridian.
Du kan selvfølgelig stadig bruge polære koordinater, men formlerne til beregning af MBR
og afstanden bliver mere kompleks.