Angenommen, ich möchte 20 nächstgelegene Unternehmen in meiner Nähe finden.
My table structure is like this:
BusinessID varchar(250) utf8_unicode_ci No None Browse distinct values Change Drop Primary Unique Index Fulltext
Prominent double No None Browse distinct values Change Drop Primary Unique Index Fulltext
LatLong point No None Browse distinct values Change Drop Primary Unique Index Fulltext
FullTextSearch varchar(600) utf8_bin No None Browse distinct values Change Drop Primary Unique Index Fulltext
With selected: Check All / Uncheck All With selected:
Print viewPrint view Propose table structurePropose table structureDocumentation
Add new fieldAdd field(s) At End of Table At Beginning of Table After
Indexes: Documentation
Action Keyname Type Unique Packed Field Cardinality Collation Null Comment
Edit Drop PRIMARY BTREE Yes No BusinessID 1611454 A
Edit Drop Prominent BTREE No No Prominent 0 A
Edit Drop LatLong BTREE No No LatLong (25) 0 A
Edit Drop sx_mytable_coords SPATIAL No No LatLong (32) 0 A
Edit Drop FullTextSearch FULLTEXT No No FullTextSearch 0
Es gibt 1,6 Millionen Geschäfte. Natürlich ist es dumm, die Entfernung für alle zu berechnen und sie dann zu sortieren.
Hier setzt der georäumliche Index an, oder?
Welchen SQL-Befehl muss ich also umsetzen?
Hinweis:
- Ich verwende MySQL Myisam räumlichen Index. Dies habe ich jedoch vorher nicht angegeben. Also werde ich diejenigen akzeptieren, die darauf antworten, um meine Wertschätzung zu zeigen und eine andere Frage zu stellen.
- Ich möchte nicht die Entfernung für die gesamte Tabelle berechnen
- Ich möchte keine Entfernung für eine Region berechnen, die noch ineffizient ist
- Ich möchte die Entfernung für eine angemessene Anzahl von Punkten berechnen, da ich die Punkte nach Entfernung sortieren und die Punkte 1-20, 21-40, 41-60 usw. anzeigen möchte.
spatial-database
optimization
mysql-spatial
user4951
quelle
quelle
Antworten:
Räumliche Abfragen sind definitiv das Richtige.
Mit PostGIS würde ich zuerst etwas Einfaches wie dieses ausprobieren und den Bereich nach Bedarf anpassen:
Dies würde Punkte (tatsächlich ihre Begrenzungsrahmen) unter Verwendung des räumlichen Index vergleichen, daher sollte es schnell sein. Ein anderer Ansatz, der in den Sinn kommt, besteht darin, Ihren Standort zu puffern und diesen Puffer dann mit den Originaldaten zu überschneiden, was möglicherweise noch effizienter ist.
quelle
Wenn Sie nur nach Proximity-Point-Suchen (Abfragen zum nächsten Nachbarn) suchen, möchten Sie dafür nicht die alten ST_DWithin- oder ST_Distance + ORDER BYs verwenden.
Nicht mehr.
Nach der Auslieferung von PostGIS 2.0 sollten Sie die knngist-Indexunterstützung (eine native PostgreSQL-Funktion) verwenden. Es wird um Größenordnungen schneller sein.
Ein Auszug aus diesem Blogeintrag, der beschreibt, wie man knn gist ohne PostGIS verwendet :
Interessanterweise gibt die Indexdurchquerung die Merkmale in der Reihenfolge ihrer Nähe zurück, sodass für die Ergebnisse keine Sortierung (dh Reihenfolge nach) erforderlich ist!
Wenn Sie es jedoch zusammen mit PostGIS verwenden möchten, ist es jetzt wirklich einfach. Folgen Sie einfach diesen Anweisungen .
Der relevante Teil ist folgender:
Aber nimm mein Wort nicht davon. Zeit es selbst :)
quelle
Mit PostGIS 2.0 unter PostgreSQL 9.1 können Sie den KNN-indizierten Operator für den nächsten Nachbarn verwenden , z.
Das Obige sollte innerhalb weniger Millisekunden abgefragt werden.
Für das nächste Vielfachen von 20, ändern zu
OFFSET 20
,OFFSET 40
usw ...quelle
<->
? Vielen Dank.<->
ist ein Operator, der den 2D-Abstand zurückgibt.MySQL Spatial
Jeder hier erklärt Ihnen, wie es mit PostgreSQL unter Verwendung von KNN geht, ohne Ihnen die Vorteile zu erklären. Mit MySQL können Sie den nächsten Nachbarn nicht ermitteln, ohne die Entfernung für alle Nachbarn zu berechnen . Das ist extrem langsam. Mit PostgreSQL kann dies für einen Index erfolgen. Weder MySQL noch MariaDB unterstützen derzeit KNN
quelle