sql-server - SQL Server 中的大整数键
问题描述
我需要创建一个带有 256 位哈希数的键的表。快速搜索和检索至关重要,所以我想知道使用什么数据结构作为 key ?
一种选择是 varchar[32],但我想搜索会很慢。存储的数据量将远高于数值解。
第二个选项是两个不同的十进制 [16] 整数并将它们组合成一个复合键,但我怀疑这是否会比选项 #1 具有更快的搜索性能。
我用谷歌搜索了那个主题,但没有找到解决方案;也许是第三种选择?任何提示表示赞赏。
解决方案
如果可能的话,最好是PRIMARY KEY
一个表作为代理键和一个数字。使用SMALLINT, ``INT
或BIGINT
与IDENTITY
应用。使用这样的定义:
[RowID] INT IDENTITY(1,1)
将帮助您解决一些常见问题 - 最重要的是,当创建新记录时,它们将附加在最后一个索引页面的末尾,因此插入时不会出现页面拆分/碎片。
可以添加其他列 - 您的哈希值,您可以在其上创建索引,以更快地通过哈希进行搜索。
例如,我有一个 IP 地址表,其中包含应用程序中使用的所有地址(基本上是用户用于登录的地址)。
该表如下所示:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[IPAddresses]
(
[IPAddressID] BIGINT IDENTITY(10000,1) NOT NULL
,[IPAddress] VARBINARY(84) NOT NULL
,[IPAddressHash] VARBINARY(64) NULL
,CONSTRAINT [PK_IPAddresses] PRIMARY KEY
(
[IPAddressID] ASC
)
,INDEX [IX_IPAddresses_IPAddressHash]
(
[IPAddressHash] ASC
)
)
GO
由于IPAddress
是个人数据,因此应加密。因为我希望我的数据被规范化并且我不想有重复的记录,所以我需要在每次用户登录时检查地址是否存在 - 如果不存在,则创建一个。我正在使用以下例程执行此操作:
在这里,我传递地址并计算我正在搜索的哈希值。最初的版本是使用哈希来解密所有值并通过文本搜索,但是对于数百万个 IP,这非常慢,并且该例程不断执行。另一方面,我只在此表中执行插入操作,并且只附加记录 - 所以根本没有碎片。
所以,我的建议是:
- 使用带有标识的数字列作为主键
- 添加表中的其余列
- 添加哈希列并按用于搜索的列构建哈希
- 在这个哈希列上创建索引
- 然后当您需要搜索记录时使用哈希,找到
PK
ID然后使用ID提取记录
推荐阅读
- java - 如何将其他类的列表项放入数组中,然后在 textview 中设置文本
- css - 在 SASS 中创建动态着色调色板时遇到问题
- python - sys.getsizeof() 如何给出不同的结果
- ruby-on-rails - 只有第一个用户/管理员应该使用 Devise 创建用户
- css - Vuejs如何在html循环中强制css内联显示
- c++ - 在vscode中使用mingw g++时,控制台上的字符坏了
- java - RequestContextHolder.getRequestAttributes() 第二次调用返回 null
- java - 线程“主”java.lang.UnsatisfiedLinkError 中的异常:java.library.path 中没有 libz3java
- java - JavaFX 中的 TableView 不会从第二个控制器中的用户输入刷新
- javascript - 在绑定到有状态值的两个组件之间进行转换