我正在使用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