2010-10-24 11 views
5

मैं दो तालिकाओं हैं: एक ipinfodb.com आईपी के स्थान का निर्धारण के लिए ip_start संख्या से युक्त से ip_group_city है, और अन्य "विज़िट" वेब साइट आगंतुक स्तंभ 'आईपी' वाले के बारे में जानकारी के साथ है।प्रभावी आईपी> स्थान क्वेरी

मुझे प्रत्येक विज़िट के लिए "विज़िट" तालिका से क्षेत्र_code की जांच करके शीर्ष 10 क्षेत्र_code (ip_groupnai से) चुनने की आवश्यकता है।

अभी मैं "विज़िट" एक सरणी में से सभी IP लोड हो रहा हूँ और कि आईपी जानकारी से ip_group_city क्वेरी करने के लिए उपयोग करते हुए:

SELECT region_code 
FROM ip_group_city 
WHERE ip_start <= INET_ATON(IP_FROM_ARR) 
ORDER BY ip_start DESC LIMIT 1 

मुझे क्या करना नेस्टेड क्वेरी के कुछ प्रकार बनाने में असमर्थ हूँ मेरे लिए नौकरी, क्योंकि अभी चीजें थोड़ी धीमी हैं :) - मेरे लैपटॉप xampp (एएमडी टूरियन x2 2GHz, विंडोज 7 परम 64 बिट संस्करण चल रहा है) पर 30s तक लगते हैं

यहां आईपी पते (विज़िट के साथ तालिका है))

CREATE TABLE IF NOT EXISTS `visits` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`clientid` mediumint(8) unsigned NOT NULL, 
`ip` varchar(15) NOT NULL, 
`url` varchar(512) NOT NULL, 
`client_version` varchar(64) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=49272 ; 

धन्यवाद

+0

इसके अलावा, अन्य तरीकों के आसपास स्वीकार किए जाते हैं पर सलाह। शायद कुछ अन्य डीबी है जो नौकरी के इस राजा के लिए अधिक प्रभावी है। मेरे पास डीबी में 10.000 आईपी हैं जो मुझे भौगोलिक स्थान के लिए हल करने की ज़रूरत है। – hummingBird

+0

मैं समस्या को पुन: उत्पन्न नहीं कर सकता। MySQL 5.1 के साथ 'ipinfodb_one_table_small' का उपयोग करके, आपकी क्वेरी मेरे लिए (लिनक्स पर) 10ms से कम हो जाती है। मुझे लगता है कि 30s कई प्रश्न पूछने के लिए हैं, उदा। सभी यात्राओं के लिए। यदि ऐसा है, तो कृपया विज़िट टेबल भी दिखाएं और आप इसे कैसे लूप करें। –

+0

ठीक है, मैं प्रश्न में तालिका संरचना जोड़ रहा हूं :) – hummingBird

उत्तर

2

जब से तुम ने कहा कि अन्य समाधान स्वागत कर रहे हैं ...

आप MaxMind की जाँच कर सकते हैं। उनके पास आईपी द्वारा अच्छा देश और शहर लुकअप है। आप इसे तेजी से बनाने के लिए अपाचे या PHP प्लगइन इंस्टॉल कर सकते हैं - डेटाबेस को स्वयं को संभालने की भी आवश्यकता नहीं है।

+0

धन्यवाद, मैं इसके साथ जाऊंगा। – hummingBird

2
अपनी मेज सूचकांक करने के लिए

:

ALTER TABLE `ip_group_city` ADD INDEX (`ip_start`) 

शीर्ष 10 region_codes पाने के लिए:

SELECT igc.region_code 
FROM ip_group_city igc 
JOIN visits v ON igc.ip_start = v.ip 
GROUP BY igc.region_code 
ORDER BY COUNT(*) DESC 
LIMIT 10 
+0

दुर्भाग्यवश, v.ip एक स्ट्रिंग आईपी एड्रेस का प्रतिनिधित्व करता है, जबकि ip_start आईपी एड्रेस से inet_aton फ़ंक्शन द्वारा एक संख्या कैलकुलेटर है। , डीबी में 'केवल' 1.5 मिल पते हैं, और वे पते मूल रूप से सभी संभावित ips को कवर करते हैं। आपका हिस्सा काम नहीं करेगा। – hummingBird

0
ALTER TABLE `ip_group_city` ADD INDEX (`ip_start`) 

thats सब मैं कह रहा हूँ। BTREE उपयोग करने के लिए और हैश नहीं सुनिश्चित हो: डी

संबंधित मुद्दे