代码之家  ›  专栏  ›  技术社区  ›  cgajardo

SQL Server中的MD5索引

  •  1
  • cgajardo  · 技术社区  · 9 年前

    假设我们有这张桌子

    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 回复  |  直到 8 年前
        1
  •  1
  •   Community CDub    8 年前

    我不确定允许您在模式方面做什么,但是如果您可以修改模式,那么SQL Server有一个名为 Indexed Views ,它们是存储在内存中的视图(与动态计算的视图相比)。

    您可以查询视图而不是基础表,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冲突,索引将失败。不知道该怎么办。。。