FAQ: Indexes

在本页面

本文档解决了有关 MongoDB indexes的一些常见问题。有关索引的更多信息,请参见Indexes

如何创建索引?

要在集合上创建索引,请使用db.collection.createIndex()方法。创建索引是一项 Management 操作。通常,应用程序不应定期调用db.collection.createIndex()

Note

索引构建会影响性能;参见索引构建如何影响数据库性能?。Management 员应在构建索引之前考虑性能影响。

索引构建如何影响数据库性能?

在集合上构建索引时,保存集合的数据库在索引构建完成之前无法进行读取或写入操作。如果需要构建较大的索引,请考虑在background中构建索引。参见填充集合上的索引构建操作在副本集上构建索引

要返回有关当前正在运行的索引创建操作的信息,请参见主动索引操作。要终止正在运行的索引创建操作,请参见db.killOp()。部分构建的索引将被删除。

如何查看集合中存在哪些索引?

要列出集合的索引,请使用db.collection.getIndexes()方法。

如何查看查询是否使用索引?

要检查 MongoDB 如何处理查询,请使用explain()方法。

如何确定要索引的字段?

许多因素决定要索引的字段,包括selectivity,对多个query shapes的支持和指数的大小。有关更多信息,请参见索引的操作注意事项Indexing Strategies

如何查看索引的大小?

db.collection.stats()包含indexSizes文档,该文档为集合中的每个索引提供大小信息。

根据其大小,索引可能不适合 RAM。当服务器的索引和working set的其余部分都有足够的可用 RAM 时,索引就适合 RAM。当索引太大而无法放入 RAM 时,MongoDB 必须从磁盘读取索引,这比从 RAM 读取要慢得多。

在某些情况下,索引不需要完全适合 RAM。有关详细信息,请参见仅在 RAM 中保存最近值的索引

写操作如何影响索引?

写操作可能需要更新索引:

  • 如果写入操作修改了索引字段,则 MongoDB 将更新所有将修改后的字段作为键的索引。

  • 当使用MMAPv1存储引擎运行时,如果对文档的更新导致文档超过了其分配的记录大小,则 MongoDB 会将文档移至新记录,并更新引用该文档的所有索引,而不管修改的字段如何。

因此,如果您的应用程序是大量写入操作,则索引可能会影响性能。