MongoDB 索引教程 – createIndex()、dropindex() 示例

索引在任何数据库中都非常重要,MongoDB 也不例外。通过使用索引,在 MongoDB 中执行查询会更有效率。

如果您的集合有数千个文档但没有索引,然后您查询以查找特定文档,那么在这种情况下,MongoDB 需要扫描整个集合来查找文档。但如果您有索引,MongoDB 将使用这些索引来限制需要搜索的文档数量。

索引是存储集合数据部分内容的特殊数据集。由于数据是部分的,因此读取这些数据会更容易。这个部分集存储了集合中某个字段或一组字段按字段值排序后的值。

理解索引的影响

现在,即使我们在介绍中已经看到索引对查询有好处,但过多的索引会减慢其他操作,例如插入、删除和更新操作。

如果对文档进行了频繁的插入、删除和更新操作,那么索引就需要经常更改,这只会增加集合的开销。

下面的示例展示了一个索引可能包含的字段值的示例。索引可以基于集合中的一个字段,也可以基于集合中的多个字段。

在下面的示例中,Employeeid “1” 和 EmployeeCode “AA” 用于索引集合中的文档。因此,当进行查询搜索时,这些索引将用于快速有效地查找集合中所需的文档。

所以,即使搜索查询是基于 EmployeeCode “AA”,该文档也会被返回。

Understanding Impact of Indexes

如何创建索引:createIndex()

在 MongoDB 中创建索引是通过使用“createIndex”方法完成的。

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

Create Indexes: createIndex()

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

代码解释

  1. createIndex 方法用于基于文档的“Employeeid”创建索引。
  2. 参数“1”表示在创建“Employeeid”字段值的索引时,应按升序排序。请注意,这与 _id 字段(_id 字段用于唯一标识集合中的每个文档)不同,MongoDB 会自动在集合中创建 _id 字段。文档现在将根据 Employeeid 而不是 _id 字段进行排序。

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

输出

Create Indexes: createIndex()

  1. numIndexesBefore: 1 表示运行命令之前索引中存在的字段值(集合中的实际字段)的数量。请记住,每个集合都有 _id 字段,它也算作索引的一个字段值。由于 _id 索引字段是在集合创建时就存在的,因此 numIndexesBefore 的值为 1。
  2. numIndexesAfter: 2 表示运行命令之后索引中存在的字段值的数量。
  3. 这里的“ok: 1”输出表示操作成功,并且新索引已添加到集合中。

上面的代码展示了如何基于一个字段值创建索引,但也可以基于多个字段值创建索引。

以下示例显示了如何执行此操作;

Create Indexes: createIndex()

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

代码解释

  • createIndex 方法现在会考虑多个字段值,这将导致基于“Employeeid”和“EmployeeName”创建索引。“Employeeid”:1 和 “EmployeeName”:1 表示应在这些 2 个字段值上创建索引,其中 :1 表示应按升序排序。

如何查找索引:getindexes()

在 MongoDB 中查找索引是通过使用 “getIndexes” 方法完成的。

以下示例显示了如何执行此操作;

Find Indexes: getindexes()

db.Employee.getIndexes()

代码解释

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

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

输出

Find Indexes: getindexes()

  • 输出返回一个文档,该文档仅显示集合中有 2 个索引,即 _id 字段,另一个是 Employee id 字段。:1 表示索引中的字段值按升序创建。

如何删除索引:dropindex()

在 MongoDB 中删除索引是通过使用 dropIndex 方法完成的。

以下示例显示了如何执行此操作;

Drop Indexes: dropindex()

db.Employee.dropIndex(Employeeid:1)

代码解释

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

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

输出

Drop Indexes: dropindex()

  1. nIndexesWas: 3 表示运行命令之前索引中存在的字段值的数量。请记住,每个集合都有 _id 字段,它也算作索引的一个字段值。
  2. ok: 1 输出表示操作成功,“Employeeid”字段已从索引中删除。

要一次性删除集合中的所有索引,可以使用 dropIndexes 命令。

以下示例显示了如何做到这一点。

Drop Indexes: dropindex()

db.Employee.dropIndex()

代码解释

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

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

输出

Drop Indexes: dropindex()

  1. nIndexesWas: 2 表示运行命令之前索引中存在的字段值的数量。
  2. 请再次记住,每个集合都有 _id 字段,它也算作索引的一个字段值,并且该字段不会被 MongoDB 删除,这就是此消息指示的内容。
  3. ok: 1 输出表示操作成功。

摘要

  • 定义索引对于在集合中更快速、更有效地搜索文档非常重要。
  • 可以使用 createIndex 方法创建索引。索引可以基于一个字段或多个字段值创建。
  • 可以使用 getIndexes 方法查找索引。
  • 可以使用 dropIndex 删除单个索引,或使用 dropIndexes 删除所有索引。