यदि आप अपने शहरों और अपनी स्थानीय स्थिति के बीच अधिकतम दूरी को सीमित कर सकते हैं, तो इस तथ्य का लाभ उठाएं कि एक मिनट का अक्षांश (उत्तर-दक्षिण) एक समुद्री मील है।
अपनी अक्षांश तालिका पर एक अनुक्रमणिका रखें।
अपने प्रश्न में दिखाए गए हावर्सिन सूत्र से अपने आप को एक हावर्सिन (lat1, lat2, long1, long2, इकाई) संग्रहीत फ़ंक्शन बनाएं। नीचे देखें
फिर mylatitude, mylongitude, और mykm को देखते हुए ऐसा करें।
SELECT *
from cities a
where :mylatitude >= a.latitude - :mykm/111.12
and :mylatitude <= a.latitude + :mykm/111.12
and haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM') <= :mykm
order by haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM')
यह एक अक्षांश बाउंडिंग बॉक्स का उपयोग उन शहरों को गंभीर रूप से रद्द करने के लिए करेगा जो आपके बिंदु से बहुत दूर हैं। आपका DBMS आपके शहरों की तालिका में उन पंक्तियों को जल्दी से चुनने के लिए आपके अक्षांश सूचकांक पर एक इंडेक्स रेंज स्कैन का उपयोग करेगा, जो विचार करने योग्य हैं। फिर यह आपके हावरसाइन फ़ंक्शन को चलाएगा, जिसमें सभी साइन और कोसाइन गणित हैं, केवल उन पंक्तियों पर।
मैं अक्षांश का सुझाव देता हूं क्योंकि देशांतर की जमीनी दूरी अक्षांश के साथ बदलती रहती है।
ध्यान दें यह कच्चा है। स्टोर-फ़ाइंडर के लिए यह ठीक है, लेकिन यदि आप एक सिविल इंजीनियर हैं तो इसका उपयोग न करें -- पृथ्वी का आकार अंडाकार है और यह मान लेता है कि यह गोलाकार है।
(111.12 जादुई संख्या के बारे में क्षमा करें। यह अक्षांश की एक डिग्री में किमी की संख्या है, जो कि साठ समुद्री मील में है।)
एक व्यावहारिक दूरी समारोह के लिए यहां देखें।
यह MySQL संग्रहीत फ़ंक्शन क्वेरी में गणना करने की तुलना में भिन्न परिणाम क्यों देता है?