常见问题解答:索引
本页内容
本文档回答了有关 MongoDB 索引的一些常见问题。有关索引的更多信息,请参阅索引.
如何创建索引?
要在集合上创建索引,请使用 db.collection.createIndex()
方法。创建索引是一项管理操作。通常,应用程序不应该定期调用 db.collection.createIndex()
。
注意
索引构建可能影响性能;请参阅索引构建如何影响数据库性能?。管理员在构建索引之前应考虑性能影响。
索引构建如何影响数据库性能?
MongoDB 对已填充集合的索引构建需要对集合进行独占读写锁。需要在对集合进行读写锁的操作必须等待 mongod
释放锁。
对于 功能兼容版本 (fcv)
"4.2"
,MongoDB 使用优化的构建过程,仅在索引构建的开始和结束时持有独占锁。其余的构建过程允许交错读写操作。对于 功能兼容版本 (fcv)
"4.0"
,默认的前台索引构建过程在整个索引构建过程中持有独占锁。后台索引构建在构建过程中 不会 持有独占锁。
有关索引构建过程的更多信息,请参阅 已填充集合上的索引构建。
索引构建在副本集上存在特定的性能考虑和风险。请参阅副本环境中的索引构建以获取更多信息。为了最小化在副本集上构建索引的影响,包括分片副本集,请使用副本集上的滚动索引构建过程。
我该如何监控索引构建进度?
要返回有关当前运行的索引创建操作的信息,请参阅活动索引操作。
我该如何终止索引构建?
要终止正在进行的索引构建,请使用db.collection.dropIndex()
或其shell辅助程序dropIndex()或dropIndexes
。不要在副本集或分片集群中使用db.killOp()
来终止正在进行的索引构建。
您不能终止副本集次要成员上的索引构建。您必须首先在主节点上删除索引。主节点停止索引构建并创建一个相关的abortIndexBuild
操作日志条目。复制的abortIndexBuild
操作日志条目的次要节点将停止正在进行的索引构建并丢弃构建作业。
要了解更多信息,请参阅停止正在进行的索引构建。
如何在集合中查看存在的索引?
要列出集合的索引,请使用 db.collection.getIndexes()
方法。
如何查看查询是否使用了索引?
要检查MongoDB如何处理查询,请使用 explain()
方法。
如何确定要索引的字段?
多个因素决定哪些字段需要建立索引,包括 选择性 和对多种 查询形状 的支持。更多详细信息,请参阅 索引的操作考虑因素 和 索引策略。
我如何查看索引的大小?
db.collection.stats()
包含一个 indexSizes
文档,它提供了集合中每个索引的大小信息。
写操作如何影响索引?
写操作可能需要更新索引
如果写操作修改了索引字段,MongoDB 将更新所有包含修改字段的索引。
因此,如果您的应用程序以写操作为主,索引可能会影响性能。
随机数据如何影响索引性能?
如果在索引字段上插入大量随机数据(例如,散列索引),则插入性能可能会降低。大量随机数据的批量插入会创建随机的索引条目,从而增加索引的大小。如果索引达到需要每次随机插入都访问不同索引条目的大小,则插入会导致WiredTiger缓存淘汰和替换率很高。当这种情况发生时,索引不再完全在缓存中,而是在磁盘上更新,这会降低性能。
为了提高在索引字段上批量插入随机数据的性能,您可以
先删除索引,然后在插入随机数据后重新创建它。
将数据插入到空的未索引集合中。
在批量插入后创建索引,这将按内存中的数据排序,并对所有索引执行有序插入。