2013-10-01 52 views
0

我有一个集合X我必须应用一个过滤器。在MongoDb中优化复合索引搜索算法

滤波器被保存为sepparate实体(收集过滤器),并将其保持的唯一数据是字段名称施加到该字段名称过滤的

的条件:

Name is Stephan and Age BETWEEN 10,20

基本上,我必须改进的是,我的过滤器中的每个字段都是在创建过滤器时添加的索引呃。

匹配的唯一结构是筛选字段上的复合索引。

总之,问题是,当我有这样一个过滤器:

的名字是斯蒂芬与年龄之间10,20

我在MongoDB的复合指数将是:{“名称”:1, “时代”:1}

不过,如果我添加了另一个筛选,让我们说:年龄是10名是Adrian和高度之间170,180

复合索引是:{“时代”:1,“名称':1,'高度':1}

{ '名称':1, '年龄':1} <> { '年龄':1, '名称':1, '身高':1}

我能做些什么,使最后的指数拟合与第一和其他方式。

请让我知道如果我没有明确。

回答

1

这个问题最清洁的解决方案是目前正在开发的index intersections。这样,每个标准的索引就足够了。

在平均时间,我看到两个选项:

  1. 使用返回根据您的标准的相关ID的单独的搜索数据库,然后用$in MongoDB中查询的实际文件。有很多工具使用这种方法,但是它增加了一些开销,因为您需要编写代码并管理第二个数据库,保持数据同步等。
  2. 使用复合索引和'无限范围查询'。例如,您可以争辩在(0,200)范围内查询年龄不会从结果集中丢弃任何人,也不会从0到400之间查询高度。

这可能不是最简洁的方法,其效率很大程度上取决于查询的细节,因此可能需要进行一些微调。

+0

指数交点如何帮助我?对不起,但我对这个话题有些模糊。 – Gabriel

+0

索引相交是一个允许db组合多个索引的功能,可以这么说。因此,对于每个可能的索引组合,您都不需要复合索引,但每个条件只有一个索引,例如一个用于年龄,名字和身高。对于一般情况,这是三个索引而不是六个,或'n'个索引而不是'n!'个索引。 – mnemosyn

+0

您能否告诉我一些更准确的“无限范围查询”选项? – Gabriel