索引支持在MongoDB中高效执行查询。如果没有索引,MongoDB必须扫描集合中的每个文档才能返回查询结果。如果查询存在适当的索引,MongoDB将使用该索引来限制它必须扫描的文档数。
尽管索引提高了查询性能,但添加索引对写入操作的性能有负面影响。对于具有高读写比率的集合,索引是昂贵的,因为每次插入都必须更新任何索引。
一、用例
如果应用程序在相同的字段上重复运行查询,则可以在这些字段上创建索引以提高性能。例如,考虑以下场景:
Scenario | Index Type |
人力资源部门通常需要按员工ID查找员工。您可以在员工ID字段上创建索引,以提高查询性能。 | Single Field Index |
销售人员通常需要按位置查找客户信息。位置存储在一个嵌入的对象中,其中包含州、城市和邮政编码等字段。可以在整个位置对象上创建索引,以提高该对象中任何字段的查询性能。 | Single Field Index on an object |
杂货店经理通常需要按名称和数量查找库存项目,以确定哪些项目库存不足。您可以在项目和数量字段上创建单个索引,以提高查询性能。 | Compound Index |
二、Details
索引是特殊的数据结构,以易于遍历的形式存储集合数据集的一小部分。MongoDB索引使用B树数据结构。
索引存储特定字段或字段集的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB可以使用索引中的顺序返回排序的结果。
三、限制
某些限制适用于索引,例如索引键的长度或每个集合的索引数。有关详细信息,请参阅索引限制。
四、默认索引
MongoDB在创建集合期间在_id字段上创建唯一索引。_id索引防止客户端插入两个文档,其中_id字段的值相同。不能删除此索引。
五、索引名称
索引的默认名称是索引键和索引(1或-1)中每个键的方向的串联,使用下划线作为分隔符。例如,在{item:1,quantity:-1}上创建的索引的名称为item_1_quantity_-1。
索引一旦创建就不能重命名。相反,必须删除索引,然后用新名称重新创建索引。
六、Create an Index
索引支持在MongoDB中高效执行查询。如果应用程序在相同的字段上重复运行查询,则可以在这些字段上创建索引,以提高这些查询的性能。
要创建索引,请使用createIndex()shell方法或驱动程序的等效方法。本页显示MongoDB Shell和驱动程序的示例。
1、关于此任务
在MongoDB Shell或驱动程序中运行创建索引命令时,MongoDB仅在不存在相同规范的索引时创建索引。
尽管索引提高了查询性能,但添加索引对写入操作的性能有负面影响。对于具有高读写比率的集合,索引是昂贵的,因为每次插入和更新都必须更新任何索引。
2、Procedure
要设置此页面上示例的语言,请使用右侧导航窗格中的选择语言下拉菜单。
要使用Async Java驱动程序创建索引,请使用com.mongodb.Async.client.MongoCollection.createIndex。
collection.createIndex( <key and index type specification>, <options>, <callbackFunction>)
本例在名称字段上创建单键降序索引:
collection.createIndex(Indexes.descending("name"), someCallbackFunction());
结果要确认索引已创建,请使用mongosh运行db.collection.getIndexes()方法:
db.collection.getIndexes()
输出:
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { name: -1 }, name: 'name_-1' }
]