MySQL Geodaten Abfrage – Performance

G.P.

Legendäres Mitglied
Ich habe in meiner Datenbank über eine Millionen Geodaten gespeichert. Für ein kleines Tool ist es wichtig, die Punkte nach ihrer Entfernung vom aktuellen Standort zu ordnen, dafür verwende ich bisher folgende MySQL Abfrage

CODE ORDER BY SQRT (((longitude-'.$place_now_ longitude.')*( longitude -'.$place_now_ longitude.')+(latitude-'.$place_now_latitude.')*(latitude -'.$place_now_latitude.')))


Da hierbei aber jedes mal alle Einträge verglichen werden müssen, ist dies aus Performancesicht denkbar ungünstig. Hat jemand eine Idee wie ich dieses Problem besser lösen kann?
 
Moin Moin,

sowas packt man auch in R-Bäume oder M-Bäume.

für die Suchmaschiene:

b-tree, m-tree, geospatial, r-tree
PostgreSQL mit r-tree, r-tree_gist
SQLite r-tree für 2-5 Dimensionen
Geoinfosysteme, Geoinformatik

Wie genau muss das sein? Erdkrümmung berücksichtigen? Eventuell reichen auch schon Entfernungsspalten über die man indexiert.


Viel Spass

edvschrat
 
Danke für die Hinweise, ich wird mich demnächst in die Themen einlesen.

Die Genauigkeit muss nicht besonders hoch sein, die Erdkrümmung kann daher ruhig ignoriert werden.

Wie genau funktionieren denn Entfernungsspalten?

Danke für deine Hilfe
 
Du könntest die letzten ziffern entfenren, und dann das in eine tabelle schreiben und darüber einen index setzen
 
Die Quadratwurzel ist überflüssig, wenn das Ziel wie beschrieben nur das ordnen ist.

Ausserdem denke ich nicht, dass jedesmal die Million Punkte geordnet werden muss.
Mach doch voher einen Select auf ein Koordinaten-Quadrat und ordne dann das Subset
z.B. wenn du ab dem Punkt sX,sY suchst, mach einen Where X > sX-1 and X < sX+1 and Y > sY-1 and Y < sY+1
Indexiere die Spalten X und Y, und dies sollte die Abfrage massiv beschleunigen
 
Zurück
Oben