我正在使用来自Ip2Location的免费 IPv6 数据表。表模式定义为:
CREATE TABLE [ip2location].[dbo].[ip2location_db11_ipv6](
[ip_from] char(39) NOT NULL,
[ip_to] char(39) NOT NULL,
[country_code] nvarchar(2) NOT NULL,
[country_name] nvarchar(64) NOT NULL,
[region_name] nvarchar(128) NOT NULL,
[city_name] nvarchar(128) NOT NULL,
[latitude] float NOT NULL,
[longitude] float NOT NULL,
[zip_code] nvarchar(30) NOT NULL,
[time_zone] nvarchar(8) NOT NULL
) ON [PRIMARY]
GO
CREATE INDEX [ip_from] ON [ip2location].[dbo].[ip2location_db11_ipv6]([ip_from]) ON [PRIMARY]
GO
CREATE INDEX [ip_to] ON [ip2location].[dbo].[ip2location_db11_ipv6]([ip_to]) ON [PRIMARY]
GO
表查询是通过将 IPv6 地址转换为IpNumber
. 提供的搜索查询是:
SELECT *
FROM ip2location_db11_ipv6
WHERE @IpNumber BETWEEN ip_from AND ip_to
我基于一些随机查找的平均查询时间约为 1.2 秒。虽然表中有3,458,959
记录,但这对我来说似乎有点慢(是吗?我绝不是 SQL 专家)。我的第一个想法是使ip_from
andip_to
列成为数字数据类型,但最大值为58569107375850417935858934690443427840
(39 位),超出了类型的最大范围DECIMAL
。有什么办法可以改善查询时间吗?