带有统计信息的大型产品目录 - Sql Server的替代品?

时间:2010-04-20 14:33:31

标签: asp.net sql-server asp.net-mvc

我正在为大型产品目录(数百万种产品)构建UI。

我使用的是Sql Server,FreeText搜索和ASP.NET MVC 对表进行规范化和索引。大多数查询返回的时间少于一秒。

问题是这个。假设用户按关键字进行搜索。在搜索结果页面上,我需要显示/查询:

  1. 在首页显示20个匹配的商品(分页,排序)
  2. 寻呼的匹配产品总数
  3. 仅限所有匹配产品的商店列表
  4. 仅限所有匹配产品的品牌列表
  5. 仅限所有匹配产品的颜色列表
  6. 每个查询大约需要0.5到1秒。总共它就像是5秒钟。

    我想让整页加载不到1秒钟 有几种方法:

    1. 进一步优化查询。我已经在这个上花了很多时间,所以不确定它是否可以进一步推进。

    2. 首先加载产品,然后使用AJAX加载其余信息。更像是一种解决方法。需要修改UI。

    3. 重新整理数据以提高报告的友好性。已经汇总了很多领域。

    4. 我检查了几个类似的网站。对于前者zappos.com。它们不仅在1秒内显示我想要的相同信息,而且还包括统计数据(每个类别中的结果数量)。

      以下是搜索关键字“white” http://www.zappos.com/white

      像zappos,amazon这样的网站如何让他们的结果,过滤器和统计数据几乎立即出现?

3 个答案:

答案 0 :(得分:1)

所以你特意问到“Zappos.com如何做到这一点”。以下是我们的搜索小组的答案。

您的问题的另一个想法是使用搜索索引,如solr。基本上,这些工作方式是将数据集加载到系统中,并进行大量索引。我的项目包括140k产品中每个产品目录的200多个数据点。平均返回时间小于20毫秒。

我推荐的搜索索引系统是Solr,它基于lucene。这两个项目都是开源的,可以免费使用。

Solr非常适合您描述的用例,因为它实际上可以在一个查询中完成所有这些操作。您可以使用facet(主要是在sql中分组)返回所有适用结果的不同数据值列表。对于关键字,它还允许您在一个查询中搜索多个字段而不会降低性能。

答案 1 :(得分:0)

您可以尝试使用这些聚合的物化索引视图替换aggergate查询。这将预先计算所有聚合,并且与选择任何常规行数据一样快。

答案 2 :(得分:0)

对于合适的硬件,

.5秒太长。我同意Aaronaught的观点,首先要做的是将其转换为单个SQL或可能的存储过程,以确保它只编译一次。

分析您的查询,看看是否可以创建更好的索引(考虑覆盖索引),微调现有索引,使用分区。

确保您具有适当的硬件配置 - 数据,日志,临时文件甚至索引文件应位于独立的轴上。确保你有足够的RAM和CPU。我希望你运行的是64位平台。

毕竟,如果您还需要更多 - 分析最常用的关键字并为前10个关键字创建汇总结果表。

亚马逊 - 他们最有可能使用优质硬件并利用CDN。此外,他们有数千台服务器在内容中存活,没有性能瓶颈 - 数据在多个数据中心重复多次。

作为完全独立的方法 - 您可能需要查看“内存中”数据库,例如CACHE - 这是您在数据库方面获得的最快速度。