U moet de punten opslaan in een enkele kolom van het datatype Point
die u kunt indexeren met een SPATIAL
index (als uw tabeltype MyISAM
is) ):
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
Dit zal de snelheid van zoekopdrachten zoals "vind alles binnen een bepaalde straal" drastisch verbeteren.
Merk op dat het beter is om gewoon TM
. te gebruiken metrische coördinaten (oost en noord) in plaats van polair (breedte- en lengtegraad). Voor kleine radii zijn ze nauwkeurig genoeg en zijn de berekeningen sterk vereenvoudigd. Als al je punten zich in één hemishpere bevinden en ver van de polen zijn, kun je een enkele centrale meridiaan gebruiken.
Je kunt natuurlijk nog steeds poolcoördinaten gebruiken, maar de formules voor het berekenen van de MBR
en de afstand zal complexer zijn.