首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >组织搜索服务的最佳方法,它可以根据筛选器集在大型数据库中查找数据。

组织搜索服务的最佳方法,它可以根据筛选器集在大型数据库中查找数据。
EN

Stack Overflow用户
提问于 2013-06-05 20:38:45
回答 5查看 1.1K关注 0票数 3

我们有大量的数据集(大约1.91亿条记录,将不断增长),每条记录都包含过滤器的值(11个过滤器-日期时间和整数值),以及一些额外的数据(成本)。例如:

代码语言:javascript
运行
复制
Depature City = 1
Arrival City = 5
Country Id = 7
Check In Date = 2013-05-05
    ... etc

Cost 1250
    ... etc

我们有一个有11个过滤器的搜索界面。在每个筛选器中,用户可以选择:一个值、一组值、所有值。

每个过滤器都有不同的可能值集,它可以从4到5000值不等。

搜索结果必须按上升成本排序,有分页(每页50个结果)。

每个搜索查询必须在100个mS内完成,通常预计为50-70个请求/秒(最大200次)。

数据往往会发生变化,但是数据变化的速度具有较低的优先级,搜索这个过程可能会比较慢。

组织这种搜索引擎的最佳方式是什么?内存中的数据(我们尝试了一些树算法)、Map (Hadoop?)、OLAP?

更新.你认为内存解决方案中的一些如何?这些记录可以以某种良好的搜索和排序结构加载到操作内存中。什么结构是最好的?

在生产环境中,客户端将能够提供合适的硬件以获得良好的解决方案。

一般来说,我们有一个.NET解决方案-所以,这个模块必须与它兼容。

EN

Stack Overflow用户

发布于 2013-07-11 15:02:48

TrollModeOn我有个问题..。试图用非sql解决方案解决这个问题,现在我遇到了两个问题,/TrollModeOff.

在我看来,无sql解决方案并不适合处理这么多过滤器的内容。我从基于sql的解决方案开始。例如,如果我们有ms sql server,我们可以使用用户定义的表类型作为筛选器,类似于:

代码语言:javascript
运行
复制
CREATE TYPE [FilterTable] AS TABLE(
    [id] [int] NOT NULL   --or any datatype needed
)

之后,您可以将表类型作为参数传递给筛选存储过程(或使用sql查询完成),如下所示:

代码语言:javascript
运行
复制
CREATE PROCEDURE [SomeFilterProcedureName]
    @Filter1 FilterTable READONLY,
    @Filter2 FilterTable READONLY
    ....

你的问题应该是:

代码语言:javascript
运行
复制
SELECT
    field1,
    field2,
    field3
FROM MyTable t
WHERE
    (@Filter1 IS NULL OR t.field1 IN (SELECT id FROM @Filter1))
    AND (@Filter2 IS NULL OR t.field2 IN (SELECT id FROM @Filter2))
    ....
ORDER BY
    whatever

因此,基本上您检查您的参数是否包含一些值,如果有-您根据筛选参数数据筛选出列值。

RDBMS非常有效地存储、查找、过滤和排序大量的数据,但是您需要正确地调整它以使其工作得更快,例如,您需要设置正确的索引。此外,您还可以缓存数据一段时间,但要确保根据不同的参数构建正确的缓存键。

如果您的db服务器不足以每秒处理200个查询,您可能想要创建一个集群,或者使用几个具有相同数据的db服务器,并使用某种db均衡器。

upd:它太大了,不能放在评论中,

It the worst case he can select "All" for every 11 filter and we have to sort 192 million records to find 20-100 with the lowest cost

所有过滤器,最低成本?是不是和:Select top(20) * from someTableName order by cost一样。

  1. Db Locks。更好地处理索引和查询。
  2. Sorting。好吧,你有1亿张符合过滤器的记录。你要怎么分类?QSort,MergeSort,BubbleSort?或者也许是stackoverflowSort?你知道你要选择哪一种海藻吗?但是,首先- DBMS知道,它选择最好的算法为情况,因为它有统计,第二,当然数据是预先存储在索引中。因此,每100 m记录排序操作都会杀死no-sql解决方案,但在rdbms上将工作得很好。
  3. High load。我们不是在说这个吗?在你的情况下,这不是真正的高负荷。有些公司每月拥有1亿到1.5亿活跃用户,拥有hella大型数据库,每秒有上千个查询,是的,他们使用rdbms。数十台服务器,分片,平衡,它的工作完美。
票数 4
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16949442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档