【问题标题】:Efficient table structure or indexing for searchable IP address ranges in SQLSQL 中可搜索 IP 地址范围的高效表结构或索引
【发布时间】: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


【解决方案1】:

检查您的过滤器字段是否有索引 - 在本例中为 range_lowrange_high

CREATE INDEX IX_geodata_range_fields ON geodata (range_low, range_high)

【讨论】:

  • 我认为数据有点颠倒了。 lookup_address 是输入,本质上是一个随机 IP 地址,所以我很确定每个请求都不需要 ALTER TABLE。
  • @MattThompson:我不确定您是否遵循此代码的功能。首先,它根据lookup_address 中保存的值在表上创建几个计算字段(一次性任务)。计算字段为相应的lookup_address 保存不同的潜在子掩码,以实现高效查找。然后它在这些字段上创建一个索引(同样,一次性任务)。随着 lookup_address 中的数据的添加或修改,索引将自行更新。最后,您可以根据需要多次运行 SELECT 语句,传递一个低和高范围。
  • 在你开始做这些之前,你确实尝试在lookup_address字段上添加一个简单的索引,对吧?
  • 对不起,我对 SQL 索引的理解有些困难。我拥有的是大量地址范围,例如 10.1.10.0 - 10.1.20.0 = USA。在初始化期间,我将有几百万个这样的条目。然后在运行时询问我,例如 10.1.10.2,我在哪个国家/地区?然后在我弄清楚之后,我被要求提供一些其他随机地址,然后是另一个,然后是另一个。我对输入“lookup_address”一无所知,除了它将是一个有效的 IP 地址。我不确定是否可以针对 range_low 和 range_high 应用您的索引方案来加快这些搜索。
  • 啊,这就是差距。 lookup_address 是搜索词,而不是存储在数据库中的信息。
猜你喜欢
  • 2010-11-05
  • 2016-02-04
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2017-12-16
  • 1970-01-01
相关资源
最近更新 更多