如果我使用explain()从shell运行mongo查询,获取所用索引的名称,然后再次运行相同的查询,但是使用hint()指定要使用的相同索引,explain plan中的"millis"字段会显著减少

例如

没有提供任何提示:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain();

{
    "cursor" : "BtreeCursor my_super_index",
    "nscanned" : 599,
    "nscannedObjects" : 587,
    "n" : 3,
    "millis" : 24,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : { ... }
} 

提供的提示:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain();

{
    "cursor" : "BtreeCursor my_super_index",
    "nscanned" : 599,
    "nscannedObjects" : 587,
    "n" : 3,
    "millis" : 2,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : { ... }
} 

唯一的区别是"毫秒"场

有人知道为什么吗?

更新:" Select 要使用的索引"并不能解释这一点,因为据我所知,mongo for each X(100?) Select 索引运行,所以它应该和提示下一次(X-1)运行一样快

推荐答案

Mongo使用一种算法来确定在没有提供提示的情况下要使用哪个索引,然后为接下来的1000个调用缓存用于类似查询的索引

但是,无论何时解释mongo查询,它都会运行索引 Select 算法,因此,与没有提示的explain()相比,带有提示的explain()花费的时间总是更少.

这里也回答了类似的问题

Mongodb相关问答推荐

Go mongo-驱动程序测试,FindOne未根据给定的筛选器返回正确结果

MongoDB聚合如何对对象数组中的值求和

为什么 mongoose 在 mongodb 中找不到我的数据

MongoDB查询优化

MongoDB 按日期时间字段查询 1h 间隔

有没有办法从另一条记录中插入一条记录

在mongodb中,如何使用聚合来获取字段之间的对应关系

如何在 Mongo 聚合中合并文档中的数组字段

Node.js 和 Passport 对象没有方法 validPassword

从命令行创建 MongoDB 用户

ZonedDateTime 与 MongoDB

如何在 Mongoose 中更新数组值

无法从 javascript 打印 BSON 对象

mongo - Ruby连接问题

MongoDB限制内存

MongoDB MapReduce - 发出一个键/一个值不调用reduce

Mongoose - 获取 _id 列表而不是具有 _id 的对象数组

如何通过键名从 mongoDB 中检索值?

spring 数据MongoDB.生成id的错误

brew install mongodb 错误:Cowardly refusing to `sudo brew install' Mac OSX Lion