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 会将文档移至新记录,并更新引用该文档的所有索引,而不管修改的字段如何。
因此,如果您的应用程序是大量写入操作,则索引可能会影响性能。