मैं टेबल में शामिल होने की तरह देखने का एक तेजी से मार्ग ढूंढने में मुद्दा हो रहा है में आईपी के टेबल के साथ शामिल हो एक बार में केवल एक आईपी पता से, मुझे entity_ip LEFT JOIN geo_ip
(या समान/एनालॉग तरीका) की आवश्यकता है।GeoIP मेज MySQL
यह वही है मैं अब के लिए है (बहुभुज का उपयोग कर के रूप में http://jcole.us/blog/archives/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis/ पर सलाह दी है):
mysql> EXPLAIN SELECT li.*, gi.country_code FROM entity_ip AS li
-> LEFT JOIN geo_ip AS gi ON
-> MBRCONTAINS(gi.`ip_poly`, li.`ip_poly`);
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+
| 1 | SIMPLE | li | ALL | NULL | NULL | NULL | NULL | 2470 | |
| 1 | SIMPLE | gi | ALL | ip_poly_index | NULL | NULL | NULL | 155183 | |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+
mysql> SELECT li.*, gi.country_code FROM entity AS li LEFT JOIN geo_ip AS gi ON MBRCONTAINS(gi.`ip_poly`, li.`ip_poly`) limit 0, 20;
20 rows in set (2.22 sec)
कोई बहुभुज
mysql> explain SELECT li.*, gi.country_code FROM entity_ip AS li LEFT JOIN geo_ip AS gi ON li.`ip_num` >= gi.`ip_num_start` AND li.`ip_num` <= gi.`ip_num_end` LIMIT 0,20;
+----+-------------+-------+------+---------------------------+------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------------------+------+---------+------+--------+-------+
| 1 | SIMPLE | li | ALL | NULL | NULL | NULL | NULL | 2470 | |
| 1 | SIMPLE | gi | ALL | PRIMARY,geo_ip,geo_ip_end | NULL | NULL | NULL | 155183 | |
+----+-------------+-------+------+---------------------------+------+---------+------+--------+-------+
mysql> SELECT li.*, gi.country_code FROM entity_ip AS li LEFT JOIN geo_ip AS gi ON li.ip_num BETWEEN gi.ip_num_start AND gi.ip_num_end limit 0, 20;
20 rows in set (2.00 sec)
(खोज में पंक्तियों की अधिक संख्या पर - कोई अंतर नहीं है)
वर्तमान में मुझे इन प्रश्नों से कोई तेज प्रदर्शन नहीं मिल रहा है क्योंकि प्रति सेकंड 0.1 सेकंड मेरे लिए बहुत धीमा है।
क्या इसे तेज़ी से बनाने का कोई तरीका है?
अंधेरे में शॉट: किसी भी मौके पर कि 'entity_ip'' ip_num' पर एक सूचकांक दूसरी क्वेरी की गति में सुधार करेगा? –
ए को MySQL के अंदर करना होगा?अगर हम ip_num_start इलाज और के रूप में संबद्ध अंक ip_num_end, और डॉट्स भर में एक व्यापक लाइन की एक्स-coord के रूप में क्रमबद्ध तरीके से entity_ip.ip_num पढ़ना, झाडू लाइन एल्गोरिथ्म की अवधारणा आप एक तेजी से n-दर-मीटर बाईं से चलाने दे सकते हैं MySQL के अंदर शामिल हों। –
लेखक के मामले के बारे में नहीं जानते, मेरे लिए (और कई लोग) mysql केवल समाधान देखना बहुत दिलचस्प होगा। – Oroboros102