Sql搜索数百万条记录。可能的

Sql搜索数百万条记录。可能的,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我的SQLServer2005数据库中有一个表,其中包含大约5000万条记录。 我有firstName和LastName列,我希望能够允许用户在这些列上搜索,而不必花费太多时间。 通过索引这些列,有没有办法让我的查询快速工作? 另外,我想搜索类似的名字。例如,如果用户搜索Danny,我希望返回名为Dan、Daniel的记录。最好向用户显示一个排名,以%表示,结果与他实际搜索的结果有多接近。 我知道这是一项艰巨的任务,但我打赌我不是世界上第一个面对这个问题的人:) 感谢您的帮助。我们的数据库有5亿

我的
SQLServer2005
数据库中有一个表,其中包含大约5000万条记录。 我有
firstName
LastName
列,我希望能够允许用户在这些列上搜索,而不必花费太多时间。 通过索引这些列,有没有办法让我的查询快速工作? 另外,我想搜索类似的名字。例如,如果用户搜索Danny,我希望返回名为Dan、Daniel的记录。最好向用户显示一个排名,以%表示,结果与他实际搜索的结果有多接近。 我知道这是一项艰巨的任务,但我打赌我不是世界上第一个面对这个问题的人:)


感谢您的帮助。

我们的数据库有5亿条记录(Oracle,但应该有类似的性能)。如果你有合适的索引,你可以在几毫秒内搜索它。在您的情况下,在firstname和lastname上放置索引。使用二叉树索引将表现良好,并将随着数据库的大小而扩展。小心的LIKE子句经常破坏索引的使用,并在很大程度上降低性能。我知道MySQL可以在通配符仅位于字符串右侧时继续使用带有LIKE子句的索引。您必须对SQL Server进行类似的搜索


字符串相似性确实不简单。看看,你会看到一些可能的算法。不能说SQL Server是否实现了其中一个,不知道该数据库。试着用谷歌搜索“SQL Server”+算法名称,也许可以找到你需要的。否则,Wiki上会提供各种语言的代码(可能不是SQL,但您应该能够将它们改编为存储过程)。

我们的数据库有5亿条记录(Oracle,但应该具有类似的性能)。如果你有合适的索引,你可以在几毫秒内搜索它。在您的情况下,在firstname和lastname上放置索引。使用二叉树索引将表现良好,并将随着数据库的大小而扩展。小心的LIKE子句经常破坏索引的使用,并在很大程度上降低性能。我知道MySQL可以在通配符仅位于字符串右侧时继续使用带有LIKE子句的索引。您必须对SQL Server进行类似的搜索


字符串相似性确实不简单。看看,你会看到一些可能的算法。不能说SQL Server是否实现了其中一个,不知道该数据库。试着用谷歌搜索“SQL Server”+算法名称,也许可以找到你需要的。否则,您在Wiki上提供了各种语言的代码(可能不是SQL,但您应该能够将它们调整为存储过程)。

您尝试过全文索引吗?我在一个超过一百万条记录的表中的自由文本字段上使用了它,发现它非常快。此外,您还可以向其添加同义词,这样Dan、Danial和Danny的索引都是相同的(在这里,您可以获得名称等效词典,这是一个不同的故事)。它也允许通配符搜索。全文索引也可以进行排名,尽管我发现它对名称不太有用(对文档更有用)。

您尝试过全文索引吗?我在一个超过一百万条记录的表中的自由文本字段上使用了它,发现它非常快。此外,您还可以向其添加同义词,这样Dan、Danial和Danny的索引都是相同的(在这里,您可以获得名称等效词典,这是一个不同的故事)。它也允许通配符搜索。全文索引也可以进行排名,尽管我发现它对名称不太有用(对文档更好)。

使用全文搜索启用此表和这些列,这将为这些列创建全文索引

对此表和这些列使用全文搜索启用,这将为这些列创建全文索引

关于“排名百分比与结果的接近程度”:您需要制定一些算法来计算此百分比。您可以使用计算“排名百分比与结果的接近程度”来为这些列编制索引-为什么不为这些列编制索引?在查询中使用LIKE时,常规索引没有用处。关于“排名百分比与结果的接近程度”:您需要制定一些算法来计算此百分比。您可以使用来计算“排名在百分比中有多接近”“索引这些列之外”-为什么不为这些列编制索引?当您在查询中使用LIKE时,常规索引没有用。只有当文本严格相同时,全文索引才会给出答案。它确实很快,但不是作者想要的。只有在文本完全相同的情况下,全文索引才能给出答案。它确实很快,但不是作者想要的。