mongodb TTL索引可以用于查询吗?

Posted

技术标签:

【中文标题】mongodb TTL索引可以用于查询吗?【英文标题】:Can a mongodb TTL index be used for queries? 【发布时间】: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) 的输出。这将显示所有考虑的候选计划。 【参考方案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 你怎么知道,显示命令的结果。

以上是关于mongodb TTL索引可以用于查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB——索引属性之TTL索引(TTL Indexes)

MongoDB——索引属性之TTL索引(TTL Indexes)

索引及集合管理 - MongoDB从入门到删库

mongo ttl索引

MongoDB中的索引操作总结

MongoDB - TTL 索引 - 未删除的文档