我有一個問題,找到連接表看上去就像是一個快速的方式與IP公司的表連接只需一個IP地址,我需要一個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)
(在人數較多的搜索行的 - 沒有任何區別)
目前我無法從這些查詢中獲得更快的性能,因爲每個IP 0.1秒對我來說太慢了。
有什麼辦法讓它更快?
在黑暗中拍攝:對entity_ip的'ip_num'上的索引會提高第二個查詢的速度的任何機會? –
必須在MySQL內部做到這一點?如果我們將ip_num_start和ip_num_end作爲關聯點,並以排序的方式將entity_ip.ip_num作爲橫掃點上的掃描線的x座標來讀取,則掃描線算法的概念可能會讓您的運行速度快於n-m左邊加入MySQL內部。 –
不知道作者的案例,對於我(和很多人)來說,只看到mysql的解決方案會非常有趣。 – Oroboros102