Sie sollten die Punkte in einer einzigen Spalte vom Datentyp Point
speichern die Sie mit einem SPATIAL
indizieren können index (wenn Ihr Tabellentyp MyISAM
ist ):
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
Dadurch wird die Geschwindigkeit von Abfragen wie "alle innerhalb eines bestimmten Radius finden" drastisch verbessert.
Beachten Sie, dass es besser ist, einfaches TM
zu verwenden metrische Koordinaten (Ostwert und Nordwert) anstelle von Polarkoordinaten (Breitengrad und Längengrad). Für kleine Radien sind sie genau genug und die Berechnungen werden stark vereinfacht. Wenn alle Ihre Punkte auf einer Hemisphäre liegen und weit von den Polen entfernt sind, können Sie einen einzigen Mittelmeridian verwenden.
Sie können natürlich immer noch Polarkoordinaten verwenden, aber die Formeln zur Berechnung des MBR
und die Entfernung wird komplexer.