याद रखें कि आईपी एक टेक्स्ट एड्रेस नहीं है, बल्कि एक संख्यात्मक आईडी है। मेरे पास एक समान स्थिति है (हम भू-आईपी लुकअप कर रहे हैं), और यदि आप अपने सभी आईपी पते को पूर्णांक के रूप में संग्रहीत करते हैं (उदाहरण के लिए, मेरा आईपी पता 192.115.22.33 है तो इसे 3228767777 के रूप में संग्रहीत किया जाता है), तो आप आईपी देख सकते हैं सही शिफ्ट ऑपरेटरों का उपयोग करके आसानी से।
इन सभी प्रकार के लुकअप का नकारात्मक पक्ष यह है कि आप इंडेक्स से लाभ नहीं उठा सकते हैं और जब भी आप लुकअप करते हैं तो आपको एक पूर्ण टेबल स्कैन करना पड़ता है। उपरोक्त योजना को सीआईडीआर नेटवर्क के नेटवर्क आईपी पते (रेंज की शुरुआत) और प्रसारण पता (रेंज का अंत) दोनों को स्टोर करके बेहतर बनाया जा सकता है, इसलिए उदाहरण के लिए 192.168.1.0/24 स्टोर करने के लिए आप दो स्टोर कर सकते हैं कॉलम:
network broadcast
3232235776, 3232236031
और फिर आप इसका मिलान कर सकते हैं आप बस करते हैं
SELECT count(*) FROM bans WHERE 3232235876 >= network AND 3232235876 <= broadcast
यह आपको डेटाबेस में CIDR नेटवर्क को स्टोर करने देता है और त्वरित संख्यात्मक अनुक्रमणिका का लाभ उठाकर जल्दी और कुशलता से IP पतों के साथ उनका मिलान करता है।
नीचे दी गई चर्चा से नोट करें :
MySQL 5.0 में एक श्रेणीबद्ध क्वेरी अनुकूलन शामिल है जिसे "इंडेक्स मर्ज इंटरसेक्ट " जो इस तरह के प्रश्नों को तेज करने की अनुमति देता है (और पूर्ण तालिका स्कैन से बचता है), जब तक:
- एक बहु-स्तंभ अनुक्रमणिका है जो क्रम में क्वेरी के स्तंभों से बिल्कुल मेल खाती है। तो - उपरोक्त क्वेरी उदाहरण के लिए, अनुक्रमणिका को
(network, broadcast)
होना चाहिए । - सभी डेटा को अनुक्रमणिका से पुनर्प्राप्त किया जा सकता है। यह
COUNT(*)
. के लिए सही है , लेकिनSELECT * ... LIMIT 1
. के लिए सही नहीं है ।
MySQL 5.6 में MRR नामक एक अनुकूलन शामिल है जो पूर्ण पंक्ति पुनर्प्राप्ति को भी गति देगा, लेकिन यह इस उत्तर के दायरे से बाहर है।