【发布时间】:2011-12-06 22:57:03
【问题描述】:
我在尝试在包含用户信息的表和包含地理位置数据的表(来自 GeoIP 的数据库)之间进行交叉引用时遇到问题。
我在用户表中有标准格式的 IP 地址(不是整数),在 GeoIP 表中有 GeoIP 数据,IP 范围为整数。
此查询有效,但速度很慢且未优化。
SELECT email, country
FROM users
INNER JOIN geoip ON users.ip BETWEEN geoip.startip AND geoip.endip
我觉得我在这里遗漏了一些非常简单的东西。
更新:此查询有效,但速度很慢 - 有什么方法可以对其进行索引以使其运行得更快?现在不管什么时候运行,每行执行大约需要300-500ms,太慢了。
SELECT email, country
FROM users INNER JOIN geoip ON INET_ATON(users.ip)
BETWEEN geoip.startip AND geoip.endip
谢谢!
更新 2:这是查询的 EXPLAIN 输出:
+----+-------------+-----------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+----------+-------------+
| 1 | SIMPLE | geoip | ALL | NULL | NULL | NULL | NULL | 3651972 | |
| 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 87996123 | Using where |
+----+-------------+-----------+------+---------------+------+---------+------+----------+-------------+
我现在无法添加仅整数的 IP 行,因为数据库正在使用中,它有超过 9000 万行;这将是我在停机期间考虑做的事情,但现在,我想让它以这种方式运行。
【问题讨论】: