我有一个问题,找到连接表看上去就像是一个快速的方式与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