我正在使用MaxMind免费数据库进行IP查找。我将数据转换为下表:加速搜索
CREATE TABLE [dbo].[GeoBlocks](
[StartIPNum] [varchar](50) NULL,
[EndIPNumb] [varchar](50) NULL,
[LocationNum] [varchar](50) NULL,
[PostalCode] [varchar](50) NULL,
[Latitude] [varchar](50) NULL,
[Longitude] [varchar](50) NULL)
此查找表中大约有350万条记录。
我的目标是通过找出其中的IP是StartIPNum和EndIPNum的记录
我的存储过程是这样确定的IP(十进制)的LocationNum: 参数:@DecimalIP BIGINT
select GeoBlocks.StartIPNum ,@DecimalIP as DecimalIp
,GeoBlocks.Postalcode ,GeoBlocks.Latitude as Latitude
,GeoBlocks.Longitude as Longitude
from GeoBlocks
where @DecimalIP between GeoBlocks.StartIPNum and GeoBlocks.EndIPNumb
我在StartIPNum和EndIPNum上创建了唯一索引。
但是,当我运行这个时,SQL服务器对查询的Where部分执行表扫描。这个查询需要650-750ms。 (我的服务器上的大多数查询需要0-2ms)
如何加快此查询?
加样品数据:
StartIPNum EndIPNumb LocationNum PostalCode Latitude Longitude
1350218632 1350218639 2782113 48.2000 16.3667
1350218640 1350218655 2782113 48.2000 16.3667
1350218656 1350218687 2782113 48.2000 16.3667
1350218688 1350218751 2782113 48.2000 16.3667
1350218752 1350218783 2782113 48.2000 16.3667
如果您使用的是IPV4地址,则可以将它们转换为'BIGINT'值并使用适当的索引。按字母顺序排序的字符串中的“小数”(?!)值可能无法满足您的要求。请提供一些示例数据?提示:使用合适的软件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服务器2014'。语法和功能的差异往往会影响答案。 – HABO
我使用sql-server和tsql进行了标记。 SQLServer是2014 –
@habo我建议发表评论的第一部分作为答案。我认为你是真实的。 – Bohemian