Angenommen, ich habe eine Tabelle:
Business(BusinessID, Lattitude, Longitude)
Alle sind natürlich indiziert. Es gibt auch 1 Million Datensätze
Angenommen, ich möchte Unternehmen finden, die 106,5 am nächsten liegen. Wie würde ich das tun?
Wenn ich mache
SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000
zum Beispiel oder wenn ich es tue
SELECT *
FROM Business
TOP 20
Theoretisch muss der Computer die Entfernung für alle Geschäfte berechnen, während in der Praxis nur diejenigen mit Längen- und Breitengraden innerhalb eines bestimmten Bereichs berechnet werden sollten.
Wie kann ich beispielsweise in PhP oder SQL tun, was ich will?
Ich bin dankbar für die bisherige Antwort. Ich benutze MySQL und sie haben nichts effizienter als die offensichtliche Lösung. MySQL räumlich hat auch keine Funktion zum Berechnen der Entfernung.
quelle
(Offenlegung: Ich bin ein Microsoft SQL Server-Typ, daher werden meine Antworten davon beeinflusst.)
Um es wirklich effizient zu machen, möchten Sie zwei Dinge: Caching und Unterstützung für native Geodaten. Mit der Unterstützung von Geodaten können Sie Geografie- und Geometriedaten direkt in der Datenbank speichern, ohne im laufenden Betrieb intensive / teure Berechnungen durchführen zu müssen, und Sie können Indizes erstellen, um sehr schnell den nächstgelegenen Punkt zu Ihrem aktuellen Standort (oder der effizientesten Route oder was auch immer) zu finden.
Das Caching ist wichtig, wenn Sie skalieren möchten. Die schnellste Abfrage ist die, die Sie nie stellen. Wenn ein Benutzer nach den ihm am nächsten liegenden Dingen fragt, speichern Sie seinen Standort und die Ergebnismenge für einen Zeitraum von Stunden in einem Cache wie Redis oder zwischengespeichert. Die Geschäftsstandorte werden sich 4 Stunden lang nicht ändern. Wenn jemand ein Unternehmen bearbeitet, muss dies jedoch nicht unbedingt in allen Ergebnismengen sofort aktualisiert werden.
quelle
Yelp verwendet wahrscheinlich GIS
PostgreSQL hat die Referenzimplementierung für GIS mit PostGIS . Yelp verwendet möglicherweise MySQL, das in jeder Hinsicht minderwertig ist . Bei so etwas wie Yelp behalten sie mit ziemlicher Sicherheit die Koordinaten für,
Diese Koordinaten befinden sich mit ziemlicher Sicherheit in WGS84 und werden als Geografietyp gespeichert. In PostgreSQL und PostGIS würde es ungefähr so aussehen:
Sie würden diese Tabelle füllen. Dann holen sie sich die WGS84-Koordinaten von Ihrem Telefon und generieren eine Abfrage wie diese mit SQL Alchemy (im Fall von Yelp).
Weitere Informationen finden Sie in unserem räumlichen Bereich und unter Geographic Information Systems @ StackExchange
quelle