MongoDB使用不同的索引

时间:2015-09-14 17:27:55

标签: performance mongodb geospatial

我有一个很大的集合,数据由lat-lng坐标和时间与各自的索引排列(球形地理空间和下降的时间)。

现在每步时间大约有10,000个点,大约有2000个时间步长,我想找到5个点中的值,这些值在某个小时间段内最接近给定坐标。

问题在于,在记录数量达到1000万之后,地理空间查询的性能变得令人不安地变得不可预测:以前只需要大约3秒的时间来获取和处理,现在可以一直达到45,在我的情况下是不可接受的。

从我在mongodb文档中读到的内容来看,如果查询需要使用地理空间索引,默认情况下它优先于查询的任何其他部分,所以在我的情况下,搜索首先通过所有2000年的时间步骤,以找到所有10'000的最近点"然后才将它缩小到我首先要求的50个步骤。这似乎更合理,因为即使.count()沿着地理索引查询也需要花费相同的时间。

所以基本上,如果可能的话,我想以其他方式做到:首先缩小一些时间步骤,然后在这个相当小的数据集上执行$ near find或$ geoNear聚合。没有地理空间部分的查询也可以保持其性能。

在.find()查询中提示另一个索引会破坏地理空间搜索,而$ geoNear在它之前不接受任何聚合管道步骤。由于某种原因在查询之前确保地理索引创建了第二个地理索引,因此聚合变得不可能

两步搜索或聚合本来是很好的,但似乎在mongo中没有这样的东西,虽然我认为它可以模仿将数据聚合到代理集合中,但这看起来是个糟糕的主意。

虽然我对mongodb索引工作和/或生命周期有一些渐渐的误解是可能的,因为请求时间并不总是那么糟糕,如果我刚写的内容可能是正确的。

以防万一:

  • mongodb 3.0.4;
  • 带有pymongo 2.8的电机0.4.1,虽然问题最初是在pymongo 3.0.3上发现的;
  • 讨论集合是副本集的一部分,查询脚本在具有辅助节点的计算机上本地运行。

0 个答案:

没有答案