0

我有一个 MVC 自动完成功能,它将搜索输入到文本框中的任意数量的字符串以查找地址。

例如,如果他们输入 John Doe New York,我的查询将对客户表中的所有列(first、last、address、city、state、zip)执行 LIKE 以查看它是否与该术语匹配。然后将移动到下一个搜索词并执行相同的操作。

我的问题是,最好是点击 Sql Server DB 4 次(在本例中)为每个字段的每个搜索词执行 LIKE,还是返回大约 10,000 行并将它们作为列表在内存中搜索会更好?

第一个在搜索表时需要更多的 DB I/O,但第二个需要更多的数据进入应用程序。

客户表中的所有数据都没有全文搜索索引,并且充其量在各个列上都有一个 SQL 索引。

4

1 回答 1

3

一般部分

最好让 DB 完成它的工作

如果您使用 4 个查询方法,您将拥有:

  1. 每个查询的时间,假设为 1 个单词的每行 6 次比较,6*4 次比较,我们称之为 24*q1(q1 - 平均行数)
  2. 传输 4 个结果的时间,设为 q2*4(q2 - 平均过滤行数)
  3. 在客户端合并/过滤结果的时间,实际上与 p1 - 每行的 24 次比较几乎相同,同样是 24*q2

如果您采用完全 db 方法,您将拥有

  1. 一次查询的时间是,4 个单词的 6 次比较 = 每行 24 次比较
  2. 传输一个结果的时间 q2_filtered (q2_filtered < q2)

24*q1 + q2*4 + 24*q2 > 24*q1 + q2_filtered所以,答案很明显——数据库应该过滤记录

如果您想将整个客户表存储在内存中 - 当然执行您自己的搜索会更快,这将花费 24*q1,因此您只需摆脱传输部分,但它会消耗 Web 服务器内存,您将内存/数据库之间的同步有问题

一些细节

取决于您如何使用 like - 您可能会遇到非常不同的性能问题,例如like 'ABC%'将使用索引,但like '%ABC%'不能使用索引

这里有一些可能的技巧,比如这个:将所有列连接成 1,对其中的符号进行排序并删除重复项,将符号存储在不同的列中,对于单词也是如此 - 这会有所帮助,因为它可以使用索引,但是你会有一些误报匹配

如果您真的需要快速获取数据 - 使用全文索引或特殊方法来解决这个真正巨大的全球性问题

于 2013-11-01T22:34:59.310 回答