MySql के विशिष्ट उत्तर नहीं, लेकिन यह आपके sql स्टेटमेंट के प्रदर्शन में सुधार करेगा।
आप जो प्रभावी ढंग से कर रहे हैं वह तालिका के प्रत्येक बिंदु से दूरी की गणना कर रहा है, यह देखने के लिए कि क्या यह किसी दिए गए बिंदु की 10 इकाइयों के भीतर है।
इस वर्ग को चलाने से पहले आप क्या कर सकते हैं, चार बिंदुओं का निर्माण करते हैं जो केंद्र में एक बिंदु पर एक बॉक्स 20 इकाइयों को खींचते हैं, अर्थात। (एक्स 1, वाई 1)। । । (x4, y4), जहां (X1, y1) (दी गई + 10 इकाइयों, दिए गए + 10 यूनिट्स) है। । । (दिए गए लोंग - 10 यूनिट, दिए गए -10 इकाइयाँ)।
वास्तव में, आपको केवल दो बिंदु चाहिए, ऊपर बाएं और नीचे दाएं कॉल उन्हें (X1, Y1) और (X2, Y2)
अब आपका एसक्यूएल स्टेटमेंट इन बिंदुओं का उपयोग उन पंक्तियों को बाहर करने के लिए करता है जो निश्चित रूप से आपके दिए गए बिंदु से 10u से अधिक हैं, यह अक्षांश और देशांतर पर अनुक्रमित का उपयोग कर सकता है, इसलिए आपके पास वर्तमान में जो कुछ भी है, उससे अधिक तेजी के आदेश होंगे।
जैसे
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
बॉक्स दृष्टिकोण गलत सकारात्मक लौट सकता है (आप दिए गए बिंदु से> 10u बॉक्स के कोनों में अंक उठा सकते हैं), इसलिए आपको अभी भी प्रत्येक बिंदु की दूरी की गणना करने की आवश्यकता है। हालाँकि यह फिर से बहुत तेज़ होगा क्योंकि आपने बॉक्स के भीतर बिंदुओं की जाँच करने के लिए अंकों की संख्या को बहुत सीमित कर दिया है।
मैं इस तकनीक को "बॉक्स के अंदर सोच" कहता हूं :)
संपादित करें: यह एक एसक्यूएल बयान में डाला जा सकता है?
मुझे नहीं पता कि mySql या Php क्या करने में सक्षम है, क्षमा करें। मुझे नहीं पता कि चार बिंदुओं का निर्माण करने के लिए सबसे अच्छी जगह कहाँ है, या वे कैसे php में एक mySql क्वेरी को पारित कर सकते हैं। हालाँकि, एक बार जब आपके पास चार बिंदु होते हैं, तो कुछ भी नहीं होता है जो आपको अपने स्वयं के एसक्यूएल स्टेटमेंट के साथ जोड़ रहा है।
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;
मैं एमएस एसक्यूएल के साथ जानता हूं कि मैं एक एसक्यूएल स्टेटमेंट बना सकता हूं जो चार फ्लोट्स (एक्स 1, वाई 1, एक्स 2, वाई 2) की घोषणा करता है और "मुख्य" चुनिंदा स्टेटमेंट से पहले उनकी गणना करता है, जैसे मैंने कहा, मुझे कोई अंदाजा नहीं है कि क्या यह किया जा सकता है माई एसक्यूएल। हालाँकि मैं अभी भी C # में चार बिंदुओं का निर्माण करने और उन्हें SQL क्वेरी के मापदंडों के रूप में पारित करने के लिए इच्छुक हूं।
क्षमा करें, मैं और अधिक मदद नहीं कर सकता, अगर कोई भी इस के MySQL और Php विशिष्ट भागों का उत्तर दे सकता है, ऐसा करने के लिए इस उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें।