Docs 菜单

Docs 主页开发应用程序MongoDB Manual

常见问题解答:索引

在此页面上

  • 如何创建索引?
  • 索引构建如何影响数据库性能?
  • 如何监控索引构建进度?
  • 如何终止索引构建?
  • 如何查看集合上存在哪些索引?
  • 如何查看查询是否使用了索引?
  • 如何确定要索引哪些字段?
  • 如何查看索引的大小?
  • 写入操作如何影响索引?
  • 随机数据如何影响索引性能?

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

要在集合上创建索引,请使用 db.collection.createIndex() 方法。创建索引是一项管理操作。一般来说,应用程序不应经常调用 db.collection.createIndex()

注意

索引构建会影响性能;请参阅索引构建如何影响数据库性能? 。管理员在构建索引之前应考虑对性能的影响。

MongoDB 在已填充的集合上建立索引时,需要对该集合施加独占读写锁。需要对集合施加读写锁的操作必须等到 mongod 释放锁。

版本 4.2 中进行了更改

  • 对于特征兼容性版本 (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 文档,其中提供了集合中每个索引的大小信息。

根据其大小,索引可能不适用于 RAM。当服务器有足够的 RAM 可用于索引和工作集的其余部分时,索引就适用于 RAM。当索引太大而不适用于 RAM 时,MongoDB 必须从磁盘读取索引,这比从 RAM 读取要慢得多。

在某些情况下,索引不需要完全容纳在 RAM 中。有关详情,请参阅仅在 RAM 中保存近期值的索引

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

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

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

如果某操作在已索引字段上插入大量随机数据(例如,哈希索引),插入性能可能会降低。随机数据的批量插入会创建随机索引条目,从而增加索引的大小。如果索引达到需要每次随机插入都访问不同索引条目的大小,则插入操作会导致较高的 WiredTiger 缓存逐出和替换速度。发生这种情况时,索引不再完全位于缓存中,而是在磁盘上更新,这会降低性能。

要提高在已索引字段上批量插入随机数据的性能,可以采用以下两种方法之一:

  • 删除索引,然后在插入随机数据后重新创建该索引。

  • 将数据插入一个空的无索引集合。

批量插入后创建索引会对内存中的数据排序并对所有索引执行有序插入。

← 常见问题解答:MongoDB 基础知识