如何使用10 M产品加快搜索/浏览/过滤?

时间:2013-07-05 14:40:32

标签: asp.net sql-server search caching indexing

背景

我在Windows 2008上使用SQL Server 2008和ASP.NET 4

我有一个包含大约1000万行产品的表格,我可以在线供用户浏览 - 而不是搜索。 1000万个产品中的每一个都有额外的属性 - 比如类别 - 我保留在查找表中 - 有三个或四个查找表。

问题

当有人浏览并开始使用过滤器(送货地点,价格,质量,品牌)时,我需要加入表格,应用所有过滤器,然后返回结果。这很慢,我想让它更快。有时用户会应用一个非常广泛的过滤器,产生800,000个结果,虽然我只返回前10个用于浏览,但我仍然需要运行查询全部800,000。

我已经尝试过的事情

我已将各个表中的所有信息加入到一个物理表中,然后为该表创建了一个覆盖索引。

查询速度要快得多,但我必须在幕后工作中做好一些维护工作,以确保有些东西缺货我会在合理的时间范围内将其取出(5分钟)或者)。

我没有使用物化/索引视图b / c我在SQL Server似乎不喜欢的结果中有聚合。

问题

除了我已经完成的索引和表优化之外,如何加快浏览结果的速度?我没有进行任何全文搜索 - 我正在使用确切的参数进行过滤。

我想到的可能的解决方案

大型缓存解决方案 - AppFabric或MemCached。我知道旁边没有关于这些并且不知道它们是合适的。

小缓存解决方案 - 也许利用ASP.NET缓存 - 但每个人都会应用不同的过滤器,所以我不确定这会给我带来多少。

固态硬盘 - 作为一种更大规模的解决方案,我一直在考虑获得固态硬盘,但这将是未来的发展方向

CDN - 我认为CDN不会帮助b / c这里的瓶颈是我的数据库的搜索功能,而不是请求者的带宽/距离。

2 个答案:

答案 0 :(得分:1)

我在复杂的连接查询中遇到类似的问题,导致可怕的响应时间。我能够通过使用Lucene.NET来解决它。它是Lucene搜索索引的.NET实现。基本上,您在数据字段(您的类别)上构建索引,然后您可以通过这些类别进行搜索并快速返回数千行。基本上,它将连接操作排除在等式之外,因为它已经通过索引知道哪些记录符合您的标准。

以下是关于Lucene.NET的一篇非常好的文章。我强烈推荐它。搜索结果使用标准连接花费了20秒,并将响应时间缩短到不到一秒钟。

http://www.codeproject.com/Articles/29755/Introducing-Lucene-Net

另外,如果您有特定的Lucene.NET implmenetation问题,请随时ping我。我刚刚经过大量的研究/学习,以便在我的网站上正确实施,所以如果你有关于如何使其工作的具体问题,我也可以帮助解决这个问题。

答案 1 :(得分:0)

  

“我执行完整的查询b / c我需要填充新的过滤器和   结果数量以及搜索结果。例如,如果   有些人过滤了“鞋子”的类别,以及TX的位置   其他过滤器将基于之前的限制   过滤器“。

尝试执行两个查询:一个用于计算所有结果,一个用于选择前N个。可能您的瓶颈是将800,000行复制到客户端。执行两个查询将以额外查询为代价来解决此问题。由于少数行的优化和仅计数查询,成本可能低于2倍。