API - 使用单词片段过滤大列表

时间:2016-10-13 15:05:06

标签: c# performance asp.net-web-api

我有asp.net web api应用程序。在数据库中,我有一个很大的列表(在100.000到200.000之间),如 id:name ,这个列表可能很少更改。我需要实现像 / pair / filter?fragment = bla 这样的过滤。它应该返回前25对,其中 name 中的任何单词都以单词片段开头。我在这里看到两种方法:第一种方法是将数据加载到缓存中(HttpRuntimeCache,像这样的redis或smth)以增加加载时间并在linq中过滤。但我认为序列化/解除序列化所需的时间会有问题。另一种方法:例如我有一对 22:这里有一些标题所以我需要提供这样的单独表格:

  • ID |的 FRAGMENT
  • 22 |一些
  • 22 |标题
  • 22 |这里

在两列上都有主键,在 FRAGMENT 列上使用单独的索引可以更快地进行查询。欢迎任何提议和评论。

UPD :现在我已经恢复了理智。我不想查询数据库,因为请求经常发生。所以现在我看到最好的解决方案是

  1. 将整个列表加载到内存中
  2. 构建trie结构,它保留每个节点中值的哈希值
  3. 如果是一个文本片段 - 只需从trie节点返回hashset,如果片段很少 - 找到所有的hashsets并得到它们的交集

3 个答案:

答案 0 :(得分:0)

您可以尝试使用当前数据库的全文索引(如果支持)和CONTAINS关键字,如此

SELECT * FROM tableName WHERE CONTAINS(name, 'bla*');

这将在整个字符串中查找以“bla”开头的单词,并且还匹配字符串“Monkeys blabla”

答案 1 :(得分:0)

我真的不明白你的问题,但如果你想查询任何表,你可以这样做,因为你已经有了queryString。你可以尝试一下。

 var res = _repository.Table.Where(c => c.Name.StartsWith("bla")).Take(25);

如果它没有帮助。尽量重新调整一下你的问题。

答案 2 :(得分:0)

这是过早优化的情况吗?

有多少用户将同时使用该服务?有多少将同时命中您的数据库?您的查询效率如何?电线将返回多少数据?

在大多数情况下,您不能比高效的数据库具有更高的性能。您的行数太小,无法在查询时给应用程序的运行时性能带来真正的沉重负担。当然,这假设您的查询编写得很好,并且您正在适当地及时打开,关闭和释放资源。

在内存中缓存数据需要权衡取舍。它增加了应用程序的内存占用,并要求您编写和维护其他代码来维护该缓存。这绝不是禁止的,但应考虑到您的整体体系结构。

请仔细考虑这些事情。据我所知,将此数据保留在数据库中很好。反序列化通常会很快(因为您返回的大多数数据都是本机类型),并且不应该限制成本。