Bukan jawaban spesifik MySql, tetapi itu akan meningkatkan kinerja pernyataan sql Anda.
Apa yang Anda lakukan secara efektif adalah menghitung jarak ke setiap titik dalam tabel, untuk melihat apakah jaraknya dalam 10 unit dari titik tertentu.
Apa yang dapat Anda lakukan sebelum Anda menjalankan sql ini, adalah membuat empat poin yang menarik kotak 20 unit di samping, dengan titik Anda di tengah yaitu. (x1, y1). . . (x4, y4), di mana (x1, y1) adalah (diberikan + 10 unit, diberikanLat + 10 unit). . . (diberikan Panjang - 10 unit, diberikanLat -10 unit).
Sebenarnya, Anda hanya perlu dua poin, kiri atas dan kanan bawah memanggil mereka (X1, Y1) dan (X2, Y2)
Sekarang pernyataan SQL Anda menggunakan titik-titik ini untuk mengecualikan baris yang pasti lebih dari 10u dari titik yang Anda berikan, dapat menggunakan indeks pada garis lintang & bujur, sehingga akan menjadi urutan besarnya lebih cepat dari apa yang Anda miliki saat ini.
misalnya
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
Pendekatan kotak dapat mengembalikan positif palsu (Anda dapat mengambil poin di sudut-sudut kotak yang> 10u dari titik yang diberikan), jadi Anda masih perlu menghitung jarak setiap titik. Namun ini lagi akan jauh lebih cepat karena Anda secara drastis membatasi jumlah poin untuk menguji poin dalam kotak.
Saya menyebut teknik ini "Berpikir di dalam kotak" :)
EDIT: Bisakah ini dimasukkan ke dalam satu pernyataan SQL?
Saya tidak tahu apa yang bisa dilakukan mySql atau Php, maaf. Saya tidak tahu di mana tempat terbaik adalah untuk membangun empat poin, atau bagaimana mereka dapat diteruskan ke permintaan mySql di Php. Namun, begitu Anda memiliki empat poin, tidak ada yang menghentikan Anda menggabungkan pernyataan SQL Anda sendiri dengan milik saya.
select name,
( 3959 * acos( cos( radians(42.290763) )
* cos( radians( locations.lat ) )
* cos( radians( locations.lng ) - radians(-71.35368) )
+ sin( radians(42.290763) )
* sin( radians( locations.lat ) ) ) ) AS distance
from locations
where active = 1
and locations.lat between X1 and X2
and locations.Long between y1 and y2
having distance < 10 ORDER BY distance;
Saya tahu dengan MS SQL saya dapat membangun pernyataan SQL yang menyatakan empat float (X1, Y1, X2, Y2) dan menghitungnya sebelum pernyataan pilih "utama", seperti saya katakan, saya tidak tahu apakah ini dapat dilakukan dengan MySql. Namun saya masih cenderung untuk membangun empat poin dalam C # dan meneruskannya sebagai parameter ke query SQL.
Maaf saya tidak bisa membantu, jika ada yang bisa menjawab bagian spesifik MySQL & Php ini, silakan edit jawaban ini untuk melakukannya.