我们假设我们有这个表
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复制的
答案 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冲突,索引将失败。不知道该怎么做......