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