पूर्व संध्या (फरवरी, 2012) पर प्रकाशित एक लेख में "
आईपी द्वारा देश की परिभाषा: एल्गोरिथम की गति का परीक्षण " शीर्षक, डेटाबेस कार्यान्वयन और मूल कार्यान्वयन की तुलना की गई थी। हम एक और भी अधिक इष्टतम और सरल एल्गोरिथ्म पर विचार करने का प्रस्ताव करते हैं, जिसे डेटाबेस और मूल संस्करण - फ्लैट श्रेणियों दोनों में लागू किया जा सकता है।
कार्यान्वयन या एल्गोरिथ्म?
मूल विकल्प को खोले बिना, आइए कार्यान्वयनों की तुलना करने की कोशिश करें, लेकिन एल्गोरिदम। वर्तमान एल्गोरिथ्म डेटाबेस संस्करण में दो कॉलम का उपयोग करता है और मूल में सीमाएं भी। लेकिन क्या होगा अगर हम पर्वतमाला को स्टोर नहीं करते हैं, लेकिन केवल उनके शुरुआती बिंदु?
एक समान विचार पहले से ही लेख में टिप्पणियों में व्यक्त किया
गया था : "... आपको सब कुछ संग्रहीत करने की आवश्यकता नहीं है, केवल सीमा के अंत ..."। दरअसल, इस मामले में, हमारी खोज स्पष्ट रूप से आधे से तेज है - हमें केवल उस सीमा की शुरुआत की आवश्यकता है जो मूल्य में है। उन लोगों के लिए जो नोटिस करते हैं कि खाली रेंज हैं, हम जवाब देंगे कि उन्हें संग्रहीत किया जा सकता है: शून्य की शुरुआत और मूल्य जो इसका प्रतीक है।
सरल पर्वतमाला या नेस्टेड?
पिछले उदाहरण में विचार किए गए उदाहरण में, हमारी राय में सरल,
जियोलाइट देश का उपयोग किया गया था, जिसमें सीमाएं ओवरलैप नहीं होती हैं और नेस्टेड रेंज की कोई समस्या नहीं होती है। एक और अधिक जटिल मामले में, जैसे, उदाहरण के लिए, रूसी
इपगिओबेस , पर्वतमाला निर्दयता से प्रतिच्छेद करती है और हम
शुरू और अंत के बीच सुई जैसे सरल प्रश्नों के साथ नहीं जा सकते। लेकिन हमें मदद करने के लिए बस खोज एल्गोरिथ्म का नामकरण आता है!
फ्लैट रेंज अवधारणा
आइए एक डेटाबेस के साथ एक उदाहरण का उपयोग करके फ्लैट श्रेणियों की अवधारणा को देखें और तुलना करें। इसके अलावा, सादगी के लिए, हम मूल्यों की सूची के बजाय, एक बार में एक मूल्य के लिए खोज के विकल्प पर विचार करेंगे। उपशीर्षक सवाल होगा, और सूची के दो तत्व नियमित और सपाट श्रेणियों के लिए उत्तर होंगे।
यह क्या है
- तीन कॉलम: शुरू, अंत, मूल्य
- दो कॉलम: प्रारंभ, मान
खाली रेंज कैसे गिनते हैं?
- कोई रास्ता नहीं - एक साधारण सीमा में उन्हें ध्यान में रखने की आवश्यकता नहीं है, क्योंकि खाली सीमा के लिए अनुरोध के मामले में, शून्य रिकॉर्ड वापस आ जाएगा।
- एक खाली सीमा की शुरुआत स्टार्ट कॉलम में रखी जाती है और वैल्यू कॉलम में एक निश्चित शून्य पदनाम होता है - यह NULL हो सकता है, लेकिन यह 0 भी हो सकता है, अगर हम स्टार्ट और वैल्यू पर कंपोजिट प्राइमरी की का उपयोग करते हैं।
आप और कितने रिकॉर्ड खत्म करते हैं?
- एक साधारण मामले में, जियोलाइटकाउंट्री की तरह - 160222।
कॉम्प्लेक्स में, जैसे IPGeoBase - 39449।
पिछले प्रारूप के जटिल और पुराने प्रकार के IPGeoBase में, जहां लगातार कई श्रेणियां हैं (उदाहरण के लिए, नवंबर 2011 से) - 148666। - GeoLiteCountry - 161619. 1% से कम की वृद्धि।
IpGeoBase - 46047. केवल 16% की वृद्धि।
पिछले प्रारूप के IPGeoBase - 31156. 80% तक घटाएँ !
इसकी तलाश कैसे करें?
- साधारण मामले में: प्रारंभ और अंत सीमा 1 के बीच सुई ।
कठिन परिस्थितियों में, जब हमारे पास घोंसले का शिकार होता है, तो हमें एक अतिरिक्त अंतर कॉलम को कनेक्ट करने की आवश्यकता होती है, जिसका उपयोग समग्र सूचकांक में किया जाएगा और इसके परिणामस्वरूप हमें हॉरर मिलता है: शुरू और अंत के बीच सुई अंत तक, अंतर 1 । - मामलों में से कोई भी सरल होगा: neddle> = प्रारंभ क्रम 1 से प्रारंभ करें ।
एक DB या किसी अन्य खोज प्रदाता को क्या करना है?
- सबसे पहले, एक दिशा में जाएं, और फिर सुनिश्चित करें कि दूसरी दिशा से सब कुछ ठीक है। यानी आम तौर पर दो आंदोलनों।
- हमेशा एक ही दिशा में जाएं।
इसे कैसे प्राप्त करें?
- हमारे पास पहले से ही है - जियोइप रेंज वाली फ़ाइल से कोई भी डाउनलोड।
- तीन स्तंभों वाली एक तालिका लें और इसे तीन स्तंभों वाली तालिका में बदलने के लिए विशेष स्ट्रीट मैजिक का उपयोग करें। देखें परिशिष्ट 1 ।
निष्कर्ष
बेशक, आप पूछते हैं - हम डेटा को सपाट दृश्य में कैसे बदलते हैं और यह कितना बढ़ेगा? हम अंत से जवाब देते हैं: वॉल्यूम में लगभग दो गुना वृद्धि होगी, और हम टिप्पणियों के साथ नीचे एसक्यूएल रूपांतरण करेंगे (देखें
परिशिष्ट 1 )।
पुनश्च: सबसे अधिक संभावना है, जब देशी संस्करण में फ्लैट रेंज की अवधारणा को लागू करते हैं, तो सब कुछ तुरंत और भी अधिक ब्रह्मांडीय होगा। जो लोग सत्यापित कर सकते हैं उनके लिए एक अनुरोध इस कथन को सत्यापित करना है।
PS2: कुछ मुझे यह भी बताता है कि अधिक सक्रिय IPv6 के युग में, अगर तब तक बड़ी संख्याएं वितरित नहीं की जाती हैं, तो फ्लैट रेंज भी बहुत उपयोगी होगी यदि भंडारण CHAR के रूप में होगा।
परिशिष्ट 1. एक उदाहरण के रूप में MySQL का उपयोग कर फ्लैट रेंज बनाना
Github.com/garex/geoip-flat-range से लिया गया, जिसका नाम github.com/garex/geoip-flat-range/blob/master/01-create-flat-range-matql.sql से लिया गया है।