MySql'e özel bir cevap değil, ancak sql ifadenizin performansını artıracaktır.
Etkili bir şekilde yaptığınız, belirli bir noktanın 10 birimi içinde olup olmadığını görmek için tablodaki her noktaya olan mesafeyi hesaplamaktır.
Bu sql çalıştırmadan önce yapabileceğiniz şey, noktanızı merkezde yani bir tarafa 20 birim çizen dört nokta oluşturmaktır. (x1, y1). . . (x4, y4) (burada x1, y1) 'dir (verilen + 10 birim boyunca, verilen + 10 birim). . . (verilenUzun - 10 birim, verilen -L-10 birim).
Aslında, sadece iki noktaya ihtiyacınız var, sol üst ve sağ alt onları (X1, Y1) ve (X2, Y2) olarak adlandırın
Şimdi SQL ifadeniz, verilen noktaları kesinlikle 10u'dan fazla olan satırları hariç tutmak için bu noktaları kullanır, enlemlerde ve boylamlarda dizinleri kullanabilir, bu nedenle şu anda sahip olduğunuzdan daha hızlı büyüklük siparişleri olacaktır.
Örneğin
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
Kutu yaklaşımı yanlış pozitifler döndürebilir (kutunun köşelerinde verilen noktadan> 10u olan noktaları toplayabilirsiniz), bu yüzden yine de her noktanın mesafesini hesaplamanız gerekir. Ancak bu çok daha hızlı olacaktır çünkü test edilecek nokta sayısını kutu içindeki noktalarla büyük ölçüde sınırlandırdınız.
Bu tekniğe "kutunun içinde düşünmek" diyorum :)
EDIT: Bu bir SQL deyimi içine konabilir mi?
MySql veya Php'nin neler yapabileceği hakkında hiçbir fikrim yok, üzgünüm. Nerede dört nokta oluşturmak için en iyi yer olduğunu bilmiyorum, ya da nasıl Php bir mySql sorgusu geçirilebilir. Ancak, dört noktaya sahip olduğunuzda, kendi SQL ifadenizi benimkilerle birleştirmenizi engelleyen hiçbir şey yoktur.
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;
MS SQL ile biliyorum Ben dört kayan (X1, Y1, X2, Y2) bildirir ve "ana" select deyiminden önce hesaplar bir SQL deyimi oluşturabilir, dediğim gibi, bu ile yapılabilir eğer hiçbir fikrim yok MySQL. Ancak yine de C # dört puan oluşturmak ve SQL sorgusu için parametre olarak bunları geçirmek eğiliminde olacaktır.
Maalesef daha fazla yardım edemem, eğer herkes bunun MySQL ve Php'ye özgü kısımlarına cevap verebilirse, bu cevabı düzenlemek için çekinmeyin.