我有GEO ip location数据库,其中每个国家都有一系列与之相关的IP。
country | ip_start | ip_end
我有一个非常大的ip列表(100万),我需要通过查找geo_database将每个ip关联到正确的国家。
我目前使用这种效率低下的查询(Python btw):
"SELECT * FROM geoipv4_country WHERE %s BETWEEN start_integer AND end_integer" % myDict[ipnum]"
正如你所看到的那样,对于我的列表中的每个ip都会这样做,这需要花费大量的时间,因为对于每个ip我需要查询数据库。
这样做有效吗?
提前谢谢
答案 0 :(得分:1)
首先,创建一个包含大量IP地址列表的表:
CREATE TABLE ip_list (
ipnum INTEGER
);
INSERT INTO ip_list (ipnum) VALUES
(<ip1>), (<ip2>), (<ip3>), (<ip4>), ..., (<ipN>);
然后,您可以使用以下查询获取列表:
SELECT i.ipnum, c.country
FROM geoipv4_country с,
ip_list i
WHERE i.ipnum BETWEEN c.start_integer
AND c.end_integer
这假设geoipv4_country
表中的范围不能重叠。
为了提高效率,请务必至少拥有以下索引:
CREATE INDEX c1 ON geoipv4_country(start_integer);
CREATE INDEX c2 ON geoipv4_country(end_integer);