Katakanlah saya ingin menemukan 20 bisnis terdekat di dekat saya.
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
Ada 1,6 juta biz. Tentu saja bodoh menghitung jarak untuk mereka semua dan mengurutkannya.
Di situlah indeks geo spasial menendang ke kanan?
Jadi apa SQL comman yang harus saya lemparkan?
catatan:
- Saya menggunakan indeks spasial mysql myisam . Namun saya tidak menentukan ini sebelumnya. Jadi saya akan menerima mereka yang menjawabnya untuk menunjukkan penghargaan saya dan mengajukan pertanyaan lain.
- Saya tidak ingin menghitung jarak untuk seluruh tabel
- Saya tidak ingin menghitung jarak untuk wilayah mana pun yang masih tidak efisien
- Saya ingin menghitung jarak untuk jumlah poin yang masuk akal karena saya ingin mengurutkan poin berdasarkan jarak dan dapat menampilkan titik 1-20, 21-40, 41-60, dll.
spatial-database
optimization
mysql-spatial
pengguna4951
sumber
sumber
Jawaban:
Kueri spasial jelas merupakan hal yang harus digunakan.
Dengan PostGIS pertama-tama saya akan mencoba sesuatu yang sederhana seperti ini dan mengubah kisaran sesuai kebutuhan:
Ini akan membandingkan titik (sebenarnya kotak pembatas mereka) menggunakan indeks spasial, jadi harus cepat. Pendekatan lain yang muncul dalam pikiran adalah buffering lokasi Anda dan kemudian memotong buffer itu dengan data asli, yang mungkin bahkan lebih efisien.
sumber
Jika semua yang Anda cari adalah pencarian titik kedekatan (pertanyaan tetangga terdekat), maka Anda tidak ingin menggunakan ST_DWithin atau ST_Distance + ORDER BYs lama untuk itu.
Tidak lagi.
Sekarang setelah PostGIS 2.0 dikirimkan, Anda harus menggunakan dukungan indeks knngist (fitur PostgreSQL asli). Ini akan menjadi urutan besarnya lebih cepat.
Kutipan dari entri blog ini yang menjelaskan cara menggunakan knn gist tanpa PostGIS :
Cukup menarik, indeks traversal akan mengembalikan fitur dalam urutan kedekatan, jadi tidak perlu melakukan pengurutan (yaitu pesanan oleh) untuk hasilnya!
Namun, jika Anda ingin menggunakannya bersama PostGIS, sekarang sangat mudah. Cukup ikuti instruksi ini .
Bagian yang relevan adalah ini:
Tapi jangan terima kata-kataku. Waktunya sendiri :)
sumber
Dengan PostGIS 2.0 di PostgreSQL 9.1, Anda dapat menggunakan KNN yang diindeks operator tetangga terdekat , misalnya:
Pertanyaan di atas akan dicari dalam beberapa milidetik.
Untuk kelipatan berikutnya 20, memodifikasi
OFFSET 20
,OFFSET 40
, dll ...sumber
<->
? Terima kasih.<->
adalah operator yang mengembalikan jarak 2D.MySQL Spatial
Semua orang di sini memberi tahu Anda cara melakukannya dengan PostgreSQL menggunakan KNN, tanpa memberi tahu Anda kelebihannya. Menggunakan MySQL Anda tidak dapat menentukan tetangga terdekat tanpa menghitung jarak untuk semua tetangga. Itu sangat lambat. Dengan PostgreSQL ini dapat dilakukan pada indeks. Baik, MySQL maupun MariaDB saat ini mendukung KNN
sumber