【问题标题】:Can a mongodb TTL index be used for queries?mongodb TTL索引可以用于查询吗?
【发布时间】:2019-07-14 01:40:37
【问题描述】:

一个集合有两个索引:

  • 一){ date: 1 }
  • B) { date: -1 } 带 TTL

我删除了索引 A,因为与索引 B 相同的索引已经存在,尽管具有 TTL 并且排序顺序相反。

Mongodb 说:

TTL 索引支持查询的方式与非 TTL 索引相同。

相反的排序顺序应该无关紧要,因为 mongodb 可以在任一方向遍历索引。

但是,根据$indexStats,索引 B 没有使用,实际上它也没有使用,因为现在执行查询需要相当长的时间。

为什么不使用索引 B?

【问题讨论】:

  • 您使用的是哪个特定版本的 MongoDB 服务器?请更新您的问题以包含查询的 explain(true) 的输出。这将显示所有考虑的候选计划。

标签: mongodb indexing


【解决方案1】:

Mongodb 可以在 One field 上创建 asc 和 desc 索引。 如:

> db.ttt.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 4,
    "numIndexesAfter" : 5,
    "ok" : 1
}
> db.ttt.createIndex( { "lastModifiedDate": -1 }, { expireAfterSeconds: 3600 } )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 5,
    "numIndexesAfter" : 6,
    "ok" : 1
}
> 

但如果您尝试重新创建索引,则无法更改它。
您可以使用getIndexes() 查看您的索引,并使用dropIndex() 重新创建它。

TTL INDEXES 也像非 TTL 索引一样工作。

为什么不使用索引 B?

这是根据您的查询和索引优化器。
如果你有更好的索引,当然不会用更差的。
您可以向我展示有关您的查询和索引的更多信息。

【讨论】:

  • 索引 B 是唯一以 date 开头的索引,因此 IMO 它是唯一适合使用的索引。
  • @Manuel 您能否使用explain(true) 输出和MongoDB 服务器版本更新您的问题?我们需要这些详细信息来查看查询计划者考虑了什么(并可能解释您的结果)。
  • @Manuel 你怎么知道,显示命令的结果。
猜你喜欢
  • 2015-10-24
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
相关资源
最近更新 更多