IP地理定位查询太慢了

时间:2016-02-22 15:31:27

标签: postgresql ip-address postgresql-9.3 maxmind

我最近开始在工作中使用PostgreSQL&我正在尝试优化查询以根据用户的IP地址对用户进行地理定位。我不完全确定如何阅读explain analyze的输出。自上次更新以来,所有表都已被清理,所以我知道这不是导致缓慢的原因。

我有以下表格:

session_ipaddress:
存储访问者的IP地址,它有〜250,000行。相关栏目&指数:

session_id VARCHAR PRIMARY KEY,
ip_address INET,
ip_int BIGINT

BTREE INDEX on ip_int

ipblocks_201601:
MaxMind GeoLite2 City Blocks数据库从http://dev.maxmind.com/geoip/geoip2/geolite2/获得,另外还有两列min_ip& max_ip共同保存CIDR块中的IP地址范围。相关栏目和索引是:

network CIDR PRIMARY KEY,
geoname_id INTEGER,
min_ip BIGINT,
max_ip BIGINT

BTREE INDEX ON geoname_id
BTREE INDEX ON min_ip
BTREE INDEX ON max_ip

ipgeolookup_201601:
en语言环境的GeoLite2位置数据库。相关栏目&指数:

geoname_id INTEGER PRIMARY KEY,
country_name VARCHAR,
subdivision_1_name VARCHAR,
city_name VARCHAR

BTREE INDEX ON country_name
BTREE INDEX ON subdivision_1_name
BTREE INDEX ON city_name

这是我正在运行的查询,需要大约20秒才能完成。

SELECT
  geo.country_name
, geo.subdivision_1_name region_name
, geo.city_name
, COUNT(s.session_id) location_unresolved
FROM session_ipaddress s
JOIN ipblocks_201601 ip ON ip.min_ip <= s.ip_int AND ip.max_ip >= s.ip_int
JOIN ipgeolookup_201601 geo ON geo.geoname_id = ip.geoname_id
WHERE geo.country_name = 'United States' OR geo.country_name = 'Canada'
GROUP BY 1, 2, 3;

总运行时间:22192.814 ms&amp;这是EXPLAIN ANALYZEhttp://explain.depesz.com/s/DNcV

的输出

1 个答案:

答案 0 :(得分:0)

您应该尝试添加复合索引。

<tfoot> <tr> <td> <textarea name='todo-textarea' id='todo-textarea' onChange={that.onChange}></textarea><br /> <button>{'Add activity'}</button> </td> </tr> </tfoot> 一个包含ipblocks_201601

另一个(geoname_id, min_ip, max_ip)包括ipgeolookup_201601

按OP编辑:

最大的改进来源是将work_mem从默认的1MB增加到4MB。数据库位于具有2GB内存的计算机上 执行时间从20秒降至5秒

添加复合索引会进一步缩短执行时间。