本文档解决了有关MongoDB 索引的一些常见问题 。有关索引的更多信息,请参见 Indexes。
要在集合上创建索引,请使用
db.collection.createIndex()
方法。创建索引是一项管理操作。通常,应用程序不应db.collection.createIndex()
定期调用
。
注意
索引构建会影响性能;请参阅 索引构建如何影响数据库性能?。管理员应在建立索引之前考虑性能影响。
针对已填充集合的MongoDB索引构建需要针对该集合的排他性读写锁定。需要对集合进行读取或写入锁定的操作必须等待,直到mongod
释放锁定为止
。
在版本4.2中进行了更改。
"4.2"
,MongoDB使用优化的构建过程,该过程仅在索引构建的开始和结束时持有排他锁。其余的构建过程将产生交错的读写操作。"4.0"
,默认的前台索引构建过程将保留整个索引构建的互斥锁。background
索引构建
在构建过程中不会获得排他锁。有关索引构建过程的更多信息,请参见填充集合上的索引构建 。
基于副本集的索引具有特定的性能考虑因素和风险。有关更多信息,请参见复制环境中的索引构建。为了最大程度地减少对副本集(包括分片副本集)建立索引的影响,请使用滚动索引生成过程,如在副本集上建立索引中所述。
要返回有关当前正在运行的索引创建操作的信息,请参阅“ 活动索引操作”。要在主数据库或独立数据库上终止正在运行的索引创建操作mongod
,请使用
db.killOp()
。部分建立的索引将被删除。
您不能在副本集的辅助成员上终止复制索引构建。您必须首先drop
在主数据库上建立索引。二级服务器将复制删除操作,并在索引构建完成后删除索引。索引建立和删除之后的所有其他复制块。
要列出集合的索引,请使用
db.collection.getIndexes()
方法。
其中db.collection.stats()
包括一个indexSizes
文档,该
文档为集合中的每个索引提供了大小信息。
根据其大小,索引可能不适合RAM。当您的服务器具有足够的RAM用于索引和其余工作集时,索引就适合RAM 。当索引太大而无法放入RAM时,MongoDB必须从磁盘读取索引,这比从RAM读取要慢得多。
在某些情况下,索引不必完全适合RAM。有关详细信息,请参阅仅在RAM中保存最近值的索引。