Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MYSQL Geo Search memiliki kinerja jarak jauh

Cara tercepat untuk melakukannya adalah dengan menggunakan ekstensi geospasial untuk MySQL, yang seharusnya cukup mudah karena Anda sudah menggunakan tabel MyISAM. Dokumentasi untuk ekstensi ini dapat ditemukan di sini:http:/ /dev.mysql.com/doc/refman/5.6/en/spatial-extensions.html

Tambahkan kolom baru dengan tipe data POINT:

ALTER TABLE `adverts` 
ADD COLUMN `geopoint` POINT NOT NULL AFTER `longitude`
ADD SPATIAL KEY `geopoint` (`geopoint`)

Anda kemudian dapat mengisi kolom ini dari bidang lintang dan bujur yang ada:

UPDATE `adverts` 
SET `geopoint` = GeomFromText(CONCAT('POINT(',`latitude`,' ',`longitude`,')'));

Langkah selanjutnya adalah membuat bounding box berdasarkan input latitude dan longitude yang akan digunakan pada WHERE Anda klausa sebagai CONTAINS paksaan. Anda perlu menentukan satu set X,Y POINT koordinat yang sesuai dengan kebutuhan Anda berdasarkan area pencarian yang diinginkan dan titik awal yang diberikan.

Permintaan terakhir Anda akan mencari semua POINT data yang ada dalam pencarian Anda POLYGON , dan Anda kemudian dapat menggunakan penghitungan jarak untuk menyaring dan mengurutkan data lebih lanjut:

SELECT a.*, 
    ROUND( SQRT( ( ( (adverts.latitude - '53.410778') * (adverts.latitude - '53.410778') ) * 69.1 * 69.1 ) + ( (adverts.longitude - '-2.97784') * (adverts.longitude - '-2.97784') * 53 * 53 ) ), 1 ) AS distance
FROM adverts a
WHERE a.type_id = 3
AND CONTAINS(a.geopoint, GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'))
HAVING distance < 25
ORDER BY distance DESC
LIMIT 0, 30

Perhatikan bahwa GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))') di atas akan tidak berfungsi , Anda harus mengganti koordinat dengan titik yang valid di sekitar awal pencarian Anda. Jika Anda memperkirakan lintang/bujur akan berubah, Anda harus mempertimbangkan untuk menggunakan pemicu untuk mempertahankan POINT data dan SPATIAL KEY yang terkait terkini. Dengan kumpulan data yang besar, Anda akan melihat peningkatan kinerja yang jauh lebih baik daripada menghitung jarak untuk setiap catatan dan memfilter menggunakan HAVING ayat. Saya secara pribadi mendefinisikan fungsi untuk digunakan dalam menentukan jarak dan membuat POLYGON bound pembatas .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Solusi MySQL untuk fungsi jendela

  2. Bagaimana cara memulihkan dari perintah database drop menggunakan log biner mysql?

  3. Cara menentukan versi MySQL

  4. Google App Engine dan Cloud SQL:Koneksi terputus ke server MySQL saat 'membaca paket komunikasi awal'

  5. mysql - cari stempel waktu berdasarkan jam