索引可以提升文档的查询速度,但建立索引的过程需要使用计算与存储资源,在已经建立索引的前提下,插入新的文档会引起索引顺序的重排。MongoDB的索引是基于B-tree数据结构及对应算法形成的。树索引存储特定字段或字段集的值,按字段值排序。索引条目的排序支持有效的等式匹配和基于范围的查询操作。如图2.7所示的过程说明了使用索引选择和排序匹配文档的查询过程。
图2.7 带有索引的查询过程
从根本上说,MongoDB中的索引与其他数据库系统中的索引类似。MongoDB在集合级别定义索引,并支持MongoDB集合中文档的任何字段或子字段的索引。
MongoDB在创建集合时,会默认在_id字段上创建唯一索引。该索引可防止客户端插入具有相同字段的两个文档,_id字段上的索引不能被删除。在分片集群中,如果不将该_id字段用作分片键,则应用需要自定义逻辑来确保_id字段中值的唯一性,通常通过使用标准的自生成的ObjectId作为_id。