有效的ip->位置查询

时间:2010-10-24 09:16:41

标签: php mysql geolocation local

我有两个表:一个是来自 ipinfodb.com 的ip_group_city,其中包含用于确定IP位置的ip_start数字,另一个是包含有关“ip”列的网站访问者信息的“访问”。 / p>

我需要通过检查“visits”表中每个IP的region_code来选择前10个region_code(来自ip_group_city)。

现在我将所有IP从“访问”加载到一个数组中,并使用该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需要长达30秒(AMD Turion x2 2GHz,运行Windows 7终极64位版本)

以下是包含IP地址(访问次数)的表格

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 ;

由于

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

既然你说过欢迎其他解决方案......

您可能想查看MaxMind。他们通过IP进行了良好的国家和城市查询。您可以安装Apache或PHP插件以加快速度 - 甚至不必自己处理数据库。

答案 2 :(得分:0)

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

这就是我所说的。一定要使用btree而不是hash:D

答案 3 :(得分:0)

您可能想查看此帖子:

Location from ip address