我有asp.net web api应用程序。在数据库中,我有一个很大的列表(在100.000到200.000之间),如 id:name ,这个列表可能很少更改。我需要实现像 / pair / filter?fragment = bla 这样的过滤。它应该返回前25对,其中 name 中的任何单词都以单词片段开头。我在这里看到两种方法:第一种方法是将数据加载到缓存中(HttpRuntimeCache,像这样的redis或smth)以增加加载时间并在linq中过滤。但我认为序列化/解除序列化所需的时间会有问题。另一种方法:例如我有一对 22:这里有一些标题所以我需要提供这样的单独表格:
在两列上都有主键,在 FRAGMENT 列上使用单独的索引可以更快地进行查询。欢迎任何提议和评论。
UPD :现在我已经恢复了理智。我不想查询数据库,因为请求经常发生。所以现在我看到最好的解决方案是
答案 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)
这是过早优化的情况吗?
有多少用户将同时使用该服务?有多少将同时命中您的数据库?您的查询效率如何?电线将返回多少数据?
在大多数情况下,您不能比高效的数据库具有更高的性能。您的行数太小,无法在查询时给应用程序的运行时性能带来真正的沉重负担。当然,这假设您的查询编写得很好,并且您正在适当地及时打开,关闭和释放资源。
在内存中缓存数据需要权衡取舍。它增加了应用程序的内存占用,并要求您编写和维护其他代码来维护该缓存。这绝不是禁止的,但应考虑到您的整体体系结构。
请仔细考虑这些事情。据我所知,将此数据保留在数据库中很好。反序列化通常会很快(因为您返回的大多数数据都是本机类型),并且不应该限制成本。