使用SQL Server中的MD5进行索引

时间:2015-08-18 14:42:54

标签: sql-server indexing md5

我们假设我们有这个表

ID | MAIL
1  | no@gmail.com
2  | yes@gmail.com
3  | anything@gmail.com

你明白了...... 我想现在查询这个表,我收到MAIL列值的MD5哈希作为输入。 所以我的查询看起来像这样:

SELECT * FROM TABLE 
WHERE HashBytes('MD5', MAIL ) = 'CE42C51D0B63DF9F616CCFB4C3FCF16C'

现在想象一下这张桌子是一张非常大的桌子,千万条记录。我的查询变得非常慢。我现在要做的是添加索引,但使用MD5。我读过它可以在PostgreSQL上使用类似的东西来完成:

CREATE INDEX mail_md5 ON TABLE(DECODE(MD5(MAIL), 'HEX'))

我可以在SQL Server中做类似的事情吗?

注意:我无法使用哈希值添加另一列:(

注2:我知道HASH是一个不可逆的函数,PostgreSQL索引的例子是从here复制的

1 个答案:

答案 0 :(得分:1)

我不确定你可以在模式方面做什么,但是如果你可以修改模式,那么SQL Server就会有一些名为Indexed Views的东西,它们是存储在内存中的视图(vs飞)。

您可以查询视图而不是基础表,SQL Server将使您保持最新状态。关键短语是WITH SCHEMABINDING,它告诉SQL Server将计算字段保留在内存中。

例如:

CREATE VIEW HashedAddresses
WITH SCHEMABINDING
AS
SELECT ID, MAIL, HASHBYTES('MD5',MAIL) as HashedMailMD5 from myschema.mytable;

然后,您可以在哈希字段上创建unique聚簇索引:

CREATE UNIQUE CLUSTERED INDEX IndexHashedAddresses ON HashedAddresses(HashedMailMD5);

之后这应该很快:

SELECT ID FROM HashedAddresses WHERE HashedMailMD5 = '0x121....'

问题:如果您遇到MD5冲突,索引将失败。不知道该怎么做......