1

我正在使用来自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_fromandip_to列成为数字数据类型,但最大值为58569107375850417935858934690443427840(39 位),超出了类型的最大范围DECIMAL。有什么办法可以改善查询时间吗?

4

1 回答 1

0

您可以尝试使用BINARY(17),39 位小数适合 17 个字节。二进制类型文档

于 2019-09-16T22:30:50.040 回答