【发布时间】:2013-09-10 14:30:01
【问题描述】:
我以映射到位置数据的 IP 地址范围表的形式向我提供地理定位服务的原始数据。
地址以字节压缩整数(每个字节一个点分四边形)的形式提供,便于存储和比较,因此该表中的每一行都提供了一个范围低地址、一个范围高地址和一些文本位置字段。我不必/不能使用 CIDR。
该表有几百万条记录。
我没有很强的 SQL 能力。我继承的代码只是做了一个 sql 调用,如:
SELECT location FROM geodata WHERE lookup_address >= range_low AND lookup_address =< range_high
表演很糟糕。我的理解是,这只会对匹配记录进行线性搜索。为了暂时解决这个问题,我将客户端缓存放在树图中以降低日志性能,但是a)我的内存使用现在很难证明,并且b)检测实时数据库更新是我不知道的问题真的很想马上解决。
似乎这个问题必须不时出现在 SQL 世界中,用于地址、电话号码等。是否有一种“标准”方法来组织和索引 SQL 表中的范围,以便我至少可以得到从直接 SQL 查询中记录性能?
【问题讨论】:
-
您使用的是什么 DBMS?其中一些提供了可以正确计算的特殊数据类型...
-
恰好是 MS 2008,但我无法依赖它。
-
IP 范围是否保证为特定格式 - 如果是,是什么格式?您可以修改表格以将地址子级别拆分为单独的列吗?
-
IP 地址是字节压缩的(例如,192.168.0.1 存储为 C0A80001 = 3232235521),因此在比较地址是否在范围内时,我可以将它们视为简单整数。似乎是 MaxMind 等大多数地理定位/geoIP 供应商支持数据的方式。
标签: sql performance range ip-address