Powiedz, że chcę znaleźć 20 najbliższych firm w pobliżu mnie.
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
Istnieje 1,6 miliona biz. Oczywiście głupio jest obliczyć odległość dla wszystkich, a następnie posortować ją.
Tam właśnie zaczyna się indeks geograficzny.
Więc co komendę SQL muszę rzucić?
Uwaga:
- Używam mysql myisam indeks przestrzenny. Jednak nie sprecyzowałem tego wcześniej. Przyjmuję więc tych, którzy odpowiedzą na to pytanie, aby okazać moje uznanie i zadać kolejne pytanie.
- Nie chcę obliczać odległości dla całego stołu
- Nie chcę obliczać odległości dla żadnego regionu, który jest nadal nieefektywny
- Chcę obliczyć odległość dla rozsądnej liczby punktów, ponieważ chcę sortować punkty według odległości i móc wyświetlać punkty 1-20, 21-40, 41-60 itp.
spatial-database
optimization
mysql-spatial
użytkownik4951
źródło
źródło
Odpowiedzi:
Kwerendy przestrzenne są zdecydowanie najlepszym rozwiązaniem.
W PostGIS najpierw spróbuję czegoś takiego uproszczonego i odpowiednio dostosuję zakres:
Spowodowałoby to porównanie punktów (a właściwie ich obwiedni) za pomocą indeksu przestrzennego, więc powinno być szybkie. Innym podejściem, które przychodzi na myśl, jest buforowanie Twojej lokalizacji, a następnie przecięcie tego bufora z oryginalnymi danymi, co może być jeszcze bardziej wydajne.
źródło
Jeśli wszystko, czego szukasz, to wyszukiwanie punktów bliskości (zapytania najbliższego sąsiada), nie chcesz do tego używać starych ST_DWithin lub ST_Distance + ORDER BY.
Nigdy więcej.
Po dostarczeniu PostGIS 2.0 powinieneś używać obsługi indeksu knngist (natywna funkcja PostgreSQL). Będzie to rząd wielkości szybciej.
Fragment tego wpisu na blogu, opisujący sposób użycia knn gist bez PostGIS :
Interesujące jest to, że przejście indeksu zwróci funkcje w kolejności bliskości, więc nie trzeba sortować (tzn. Sortować według) wyników!
Jeśli jednak chcesz używać go razem z PostGIS, teraz jest to naprawdę łatwe. Postępuj zgodnie z tymi instrukcjami .
Odpowiednia część to:
Ale nie wierz mi na słowo. Czas to sam :)
źródło
Dzięki PostGIS 2.0 na PostgreSQL 9.1 możesz użyć indeksowanego przez KNN operatora najbliższego sąsiada , np .:
Powyższe powinno wykonać zapytanie w ciągu kilku milisekund.
Przez następne wielokrotności 20, aby modyfikować
OFFSET 20
,OFFSET 40
itp ...źródło
<->
? Dzięki.<->
jest operatorem, który zwraca odległość 2D.MySQL Spatial
Wszyscy tutaj mówią ci, jak to zrobić z PostgreSQL przy użyciu KNN, bez informowania o zaletach. Za pomocą MySQL nie można ustalić najbliższego sąsiada bez obliczenia odległości dla wszystkich sąsiadów. To bardzo wolno. Z PostgreSQL można tego dokonać na indeksie. Ani MySQL, ani MariaDB nie obsługują obecnie KNN
źródło