MongoDB 索引:createIndex() 和 dropIndex()

⚡ 智能摘要

MongoDB 索引存储集合字段的有序子集,以便查询无需扫描每个记录即可找到文档。`createIndex`、`getIndexes` 和 `dropIndex` 方法用于构建、列出和删除这些对性能至关重要的结构。

  • 🚀 目的: 索引 MongoDB 跳过完整集合扫描以加快读取速度。
  • 🛠️ 创建索引: 按升序或降序构建单字段或复合索引。
  • 🔍 获取索引: 列出集合中的每个索引,包括默认的 _id。
  • 🗑️ dropIndex: 删除一个索引;dropIndexes 会清除除 _id 之外的所有索引。
  • 权衡: 索引过多会降低插入、更新和删除操作的速度。
  • 🤖 AI调优: 助手会自动推荐和生成合适的索引。

MongoDB 索引创建索引删除索引

是什么 MongoDB 索引?

索引在任何数据库中都非常重要,并且 MongoDB 情况也一样。使用索引,执行查询时…… MongoDB 变得更有效率。

如果你有一个包含数千个文档且没有索引的集合,然后你查询以查找某些文档,那么在这种情况下…… MongoDB 需要扫描整个集合才能找到文档。但如果你有索引, MongoDB 将使用这些索引来限制必须在集合中搜索的文档数量。

索引是特殊的数据集,它存储集合的部分数据。由于数据是部分存储的,因此更容易读取。这个部分数据集存储特定字段或一组字段的值,并按字段值排序。

了解索引的影响

尽管引言部分已经表明索引对查询有好处,但过多的索引会减慢其他操作,例如插入、删除和更新操作。

如果对文档频繁执行插入、删除和更新操作,那么索引就需要频繁更改,这只会给集合带来额外的开销。

以下示例展示了集合中哪些字段值可以构成索引。索引可以基于集合中的单个字段,也可以基于集合中的多个字段。

在以下示例中,员工 ID 为“1”,员工Code “AA”用于为集合中的文档建立索引。因此,当执行查询搜索时,这些索引将用于快速高效地在集合中找到所需的文档。

因此,即使搜索查询是基于员工的。Code 如果选择“AA”,该文件将被退回。

了解索引的影响

如何创建索引:createIndex()

创建索引 MongoDB 通过使用 创建索引 方法。

以下示例展示了如何向集合中添加索引。假设我们有一个名为 Employee 的集合,其中包含名为“Employeeid”和“EmployeeName”的字段。

使用 createIndex 创建索引

db.Employee.createIndex({Employeeid:1})

Code 说明:

  1. 创建索引 方法用于根据文档的“Employeeid”创建索引。
  2. “1”参数表示,当使用“Employeeid”字段值创建索引时,应按升序排列。请注意,这与用于唯一标识每个文档的_id字段不同。 MongoDB 会自动创建。文档现在将按员工 ID 排序,而不是按 _id 字段排序。

如果命令执行成功,将显示以下输出:

输出:

创建索引输出

  1. numIndexesBefore: 1 表示命令运行前索引中的字段值数量。每个集合都有一个 _id 字段,它也算作一个字段值,因此 numIndexesBefore 为 1。
  2. numIndexesAfter: 2 表示命令运行后索引中的字段值数量。
  3. “ok: 1”输出表示操作成功,新索引已添加到集合中。

上面的代码展示了如何基于单个字段值创建索引,但也可以基于多个字段值创建索引。以下示例展示了如何实现这一点:

在多个字段上创建复合索引

db.Employee.createIndex({Employeeid:1, EmployeeName:1})

createIndex 方法现在会考虑多个字段值,这将导致索引基于“Employeeid”和“EmployeeName”创建。Employeeid:1 和 EmployeeName:1 表示索引应基于这两个字段值创建,其中 :1 表示升序排列。这被称为复合索引。

如何查找索引:getIndexes()

查找索引 MongoDB 通过使用 获取索引 方法。以下示例展示了如何实现这一点:

使用 getIndexes 查找索引

db.Employee.getIndexes()

getIndexes 方法用于查找集合中的所有索引。

如果命令执行成功,将显示以下输出:

输出:

获取索引输出

输出结果返回一个文档,其中显示集合中有两个索引:_id 字段和 Employeeid 字段。:1 表示索引中的字段值按升序排列。

如何删除索引:dropIndex()

删除索引 MongoDB 通过使用 dropIndex 方法。以下示例展示了如何实现这一点:

使用 dropIndex 删除索引

db.Employee.dropIndex({Employeeid:1})

dropIndex 方法接受需要从索引中删除的字段值。

如果命令执行成功,将显示以下输出:

输出:

dropIndex 输出

  1. nIndexesWas: 3 表示命令运行前索引中字段值的数量。每个集合都有一个 _id 字段,该字段也算作一个字段值。
  2. ok: 1 输出指定操作成功,并且“Employeeid”字段从索引中删除。

要一次性删除集合中的所有索引,可以使用 dropIndexes 命令。以下示例展示了如何执行此操作:

使用 dropIndexes 命令删除所有索引

db.Employee.dropIndexes()

dropIndexes 方法将删除除 _id 索引之外的所有索引。

如果命令执行成功,将显示以下输出:

输出:

dropIndexes 输出

  1. nIndexesWas: 2 表示运行该命令之前索引中的字段值数量。
  2. 每个集合都有一个 _id 字段,该字段也算作一个字段值,不会被删除。 MongoDB这就是这条信息所表达的意思。
  3. ok: 1 输出表明操作成功。

常见问题

单字段索引仅对一个字段进行排序,适用于仅基于该字段进行筛选的查询。复合索引在一个结构中涵盖多个字段,适用于同时基于这些字段进行筛选或排序的查询。复合索引最多支持 32 个字段。

_id 字段是 MongoDB主键是每个集合的主键,因此每个集合都会自动获得一个唯一的 _id 索引。它不能被删除。这就是为什么即使在添加任何自定义索引之前,numIndexesBefore 的初始值也是 1 的原因。

使用 `.explain(“executionStats”)` 运行查询。在最优执行计划中,`IXSCAN` 阶段表示使用了索引,而 `COLLSCAN` 阶段表示未使用索引。 MongoDB 已扫描所有文件,新的索引或许会有帮助。

使用 `$indexStats` 聚合阶段可以查看每个索引的访问频率。使用率极低的索引会浪费磁盘空间并降低写入速度,因此请使用 `dropIndex` 删除它们以保持集合的精简。

AI工具分析慢查询日志,并建议要索引哪些字段。 MongoDB的绩效顾问会根据影响力对指数推荐进行排名,并提供帮助ping 添加高价值索引,跳过冗余索引。

是的。AI Copilot 助手会将简单的英语请求转换为正确的 createIndex 语法,包括升序或降序键以及复合字段顺序,然后解释生成的索引。

ESR 代表等值、排序、范围。构建复合索引时,首先放置等值匹配字段,然后是排序字段,最后是范围筛选器。这种顺序允许…… MongoDB 以最有效的方式使用索引。

覆盖查询完全基于索引进行解答,无需读取文档。当筛选器和投影中的每个字段都位于同一个索引中时, MongoDB 返回结果更快。

总结一下这篇文章: