Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中可搜索IP地址范围的高效表结构或索引_Sql_Performance_Range_Ip Address - Fatal编程技术网

SQL中可搜索IP地址范围的高效表结构或索引

SQL中可搜索IP地址范围的高效表结构或索引,sql,performance,range,ip-address,Sql,Performance,Range,Ip Address,我有地理定位服务的原始数据,以映射到位置数据的IP地址范围表的形式提供给我 地址以字节压缩整数的形式提供(每个字节一个虚线四元组),便于存储和比较,因此此表中的每一行提供一个范围低地址、一个范围高地址和一些文本位置字段。我不必/我不能使用苹果酒 这张表有几百万条记录 我没有强壮的SQL排骨。我继承的代码只执行如下sql调用: SELECT location FROM geodata WHERE lookup_address >= range_low AND lookup_address =

我有地理定位服务的原始数据,以映射到位置数据的IP地址范围表的形式提供给我

地址以字节压缩整数的形式提供(每个字节一个虚线四元组),便于存储和比较,因此此表中的每一行提供一个范围低地址、一个范围高地址和一些文本位置字段。我不必/我不能使用苹果酒

这张表有几百万条记录

我没有强壮的SQL排骨。我继承的代码只执行如下sql调用:

SELECT location FROM geodata WHERE lookup_address >= range_low AND lookup_address =< range_high
从地理数据中选择位置,其中lookup\u address>=range\u low和lookup\u address=
表演糟透了。我的理解是,这将只是对匹配记录进行线性搜索。为了暂时解决这个问题,我将一个客户端缓存放在一个树映射中,以降低日志性能,但是a)我的内存使用现在很难证明是合理的,b)检测实时数据库更新是我现在不想解决的问题


似乎在SQL世界中,地址、电话号码等的问题时不时会出现。。是否有一种“标准”的方法来组织和索引SQL表中的范围,以便我至少可以从直接SQL查询中获得日志性能

检查您的过滤器字段是否有索引-在这种情况下,
range\u low
range\u high

CREATE INDEX IX_geodata_range_fields ON geodata (range_low, range_high)

您使用的是什么数据库管理系统?其中一些提供了正确计算的特殊数据类型…碰巧是MS 2008,但我不能依赖它。IP范围是否保证采用特定格式?如果是,是什么格式?您可以修改该表以将地址子级拆分为单独的列吗?IP地址是字节压缩的(例如,192.168.0.1存储为C0A80001=3232235521),因此,在比较地址是否在某个范围内时,我可以将其视为简单整数。似乎是像MaxMind这样的大多数地理定位/geoIP供应商支持数据的方式。我认为数据有点颠倒了。lookup_地址是输入,本质上是一个随机的IP地址,所以我很确定在每个请求上都不需要使用ALTER TABLE。@MattThompson:我不确定您是否遵循了这段代码的功能。首先,它根据
lookup\u address
中保存的值在表上创建几个计算字段(一次性任务)。计算字段为相应的lookup\u address保存不同的潜在子磁盘,以便高效查找。然后在这些字段上创建一个索引(同样是一次性任务)。当添加或修改查找地址中的数据时,索引将自动更新。最后,您可以随意多次运行SELECT语句,传递一个低范围和一个高范围。在开始执行任何操作之前,您确实尝试过在
lookup\u address
字段中添加一个简单的索引,对吗?对不起,我对SQL索引的理解有点困难。我有一个地址范围的大列表,比如10.1.10.0-10.1.20.0=USA。在初始化期间,我会有几百万个这样的条目。然后在运行期间,我被问到,比如说,10.1.10.2,我在哪个国家?然后,在我弄明白这一点后,我被要求提供其他一些随机地址,然后是另一个,然后是另一个。我对输入“lookup_address”一无所知,只知道它是一个有效的IP地址。我不确定我能不能对range\u low和range\u high应用你的索引方案来加速这些搜索。啊,这就是差距。lookup_address是搜索词,而不是存储在数据库中的信息。