【问题标题】:Improve geoIndex performance on mongo提高 mongo 上的 geoIndex 性能
【发布时间】:2014-09-24 20:10:42
【问题描述】:

我有下一个收集样本:

var testSchema = new Schema({
title:          {type: String, required: true},
owner:          {type:Schema.Types.ObjectId}, 
locatedAt:      {type: {}, index: '2dsphere', sparse: true, "2dsphereIndexVersion": 2, required: true}
});

我插入了 10.000 行来评估架构性能

db.test.find({"locatedAt":{"$near":{"$geometry":{"type":"Point","coordinates":[2.240413,41.582159]}}}}).explain();

结果是下一个:

{
    "cursor" : "S2NearCursor",
    "isMultiKey" : false,
    "n" : 10000,
    "nscannedObjects" : 48846,
    "nscanned" : 48846,
    "nscannedObjectsAllPlans" : 48846,
    "nscannedAllPlans" : 48846,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 95,
    "indexBounds" : {

    },
    "filterSet" : false
}

我尝试创建具有相同结果的“2d”索引。

总结一下,我认为查询扫描了太多行,我做错了什么?也许是模式定义?

谢谢!!

【问题讨论】:

  • 对于地理索引,nscanned* 数字不是文档。它们代表了地理索引内部的一些东西,这不一定很重要 - 重要的是这个数字仍然与工作量成正比,所以它可以用来比较地理查询。报告的获取所有 10000 个文档的时间是 95 毫秒,所以我认为查询执行得很好(注意:一般来说,在解释中实际上不要使用 millis 字段来获取时间信息)。
  • 感谢您的评论。我今天继续评估信息(学习“解释”字段的含义),如果您包含限制或约束,则 nscanned 数据是正确的,而 milis 变为 4。所以,这只是对 find 的错误利用,这不是架构定义的过滤器的问题。

标签: mongodb mongodb-indexes 2dsphere


【解决方案1】:

在评估了“Explain”文档和博客中的一些主题之后,我需要得出结论,这不是索引问题或架构定义问题。

如果您包含 limit 约束,nscanned 对象会从大约 50k 个对象减少到 36 个(限制 10),milis 会减少到 4 个。

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2012-05-15
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多