क्षमा करें, लेकिन यह एक SQL उत्तर नहीं है, बल्कि आपके डेटा पर कुछ बाधाओं को मानकर पूर्वानुमेय प्रदर्शन प्राप्त करने का एक तरीका है।
डेटा कितनी बार बदल रहा है? यदि संभव हो, तो क्या आप प्रत्येक इकाई के 5 निकटतम पड़ोसियों के ग्राफ़ की पूर्व-गणना कर सकते हैं, और उसका उपयोग अपने चयन को गति देने के लिए कर सकते हैं।?
यदि यह डेटा अधिकतर केवल पढ़ने के लिए है, तो...
इन बिंदुओं को समान रूप से कैसे वितरित किया जाता है? यदि वितरण को समान रूप से और अच्छी तरह से जानते हैं, तो क्या आप हैश तालिका में प्रत्येक निर्देशांक और अनुक्रमणिका को बकेट करके अपना स्वयं का स्थानिक मानचित्रण रोल कर सकते हैं।
यदि आपको डेटाबेस में डेटा रखने की आवश्यकता नहीं है, तो इसे तेज़ हैश लुकअप के लिए मेमोरी मैप की गई फ़ाइल में ले जाएं। (70m रिकॉर्ड आसानी से मेमोरी में फिट होने चाहिए)।
मैंने प्रदर्शन विज्ञापन और खोज इंजन प्रासंगिकता के लिए उप-मिलीसेकंड लुकअप जेनरेट करने के लिए इस आर्किटेक्चर का उपयोग किया है।
==विस्तार==
आप बस निश्चित आकार के वर्गों (एक शतरंज की बिसात की तरह) का एक ग्रिड बनाते हैं, और आप प्रत्येक बिंदु को ग्रिड में मैप करते हैं, और आप उन वस्तुओं की एक सूची बनाते हैं जो प्रत्येक ग्रिड-बक्से में होती हैं - यदि आप प्रत्येक के आकार को समायोजित करते हैं सही ढंग से बॉक्स में, आपके प्रत्येक वर्ग में औसतन 5-50 अंक होने चाहिए -- यह सिद्धांत रूप में एक क्वाड-ट्री है लेकिन सादगी के लिए पेड़ के बिना है।
आपके द्वारा सभी डेटा को बकेट में बिखेरने के बाद खाली होने वाली प्रत्येक बकेट के लिए, आप डेटा वाले निकटतम बकेट की जानकारी जोड़ते हैं।
अब आप प्रत्येक बकेट को बाएँ-से-दाएँ-पंक्ति-नाय-पंक्ति को क्रमांकित कर सकते हैं ताकि प्रत्येक बकेट में एक अद्वितीय संख्या हो जिसे निर्देशांकों से परिकलित किया जा सके -- और आप प्रत्येक बकेट को हैश तालिका में सम्मिलित करें, या यदि स्थान की अनुमति हो एक सीधी लुकअप तालिका।
अब जब आपके पास आपकी क्वेरी है, तो आप बस गणना करते हैं कि कौन सी बकेट को मैप किया जाएगा, और आपको या तो उस बकेट में वस्तुओं की एक सूची मिलेगी, या आपको एक 'खाली' बकेट मिलेगी जिसमें सामग्री वाले निकटतम बकेट के पॉइंटर्स होंगे ।
यह आपको उन वस्तुओं की पहली उम्मीदवार सूची देगा जिन्हें आप ढूंढ रहे हैं, और अब आपको बस दौड़ना है और देखना है कि कौन सा निकटतम है।
99% मामलों में ऐसा ही होगा - लेकिन अगर आप इसके बारे में चिंतित हैं (ए) या तो अगले ओवर की बकेट में कुछ कंडिडेट हैं जो वास्तव में करीब हैं, तो बस 8 आसपास की बाल्टियों की जांच करें, और देखें कि क्या आप कर सकते हैं वहां और भी करीब खोजें।
यदि आप अब उन सभी वस्तुओं की सूची प्राप्त करना चाहते हैं जो निकटतम हैं, तो प्रत्येक ओबजेक्ट के लिए 5 निकटतम नेगबोर के एक साधारण नेटवर्क की गणना करें, ताकि आप ए-> {बी, सी, डी जैसी डेटा संरचना के साथ समाप्त हो जाएं। ,E,F}, B->{A,D,G,H,I}, C->{A,J,K,G,M}....
यह एक सरल नेटवर्क बनाएगा जिसे अब आप Dijkstra की विविधता के साथ पार कर सकते हैं अपने निकटतम बिंदु से सटे सभी बिंदु प्राप्त करने के लिए यहां।
डेटा संरचनाओं के निर्माण में समय लगेगा, लेकिन एक बार हो जाने के बाद, और सही लुकअप और डेटासेट को वापस करना सब मिलीसेकंड में किया जा सकता है (इसमें कोई http या ऑफ-बॉक्स संचार शामिल नहीं है)
आशा है कि यह मदद करता है।