Mongodb索引介绍
在 MongoDB 中,索引提高查询的执行效率。没有索引,MongoDB 必须执行集合扫描,即扫描集合中的每个文档,然后找出与查询语句相匹配的结果。如果查询存在适当的索引,MongoDB 可以使用索引来限制它必须检查文档的数目。
索引是以简单的方式遍历存储在集合中一小部分数据集的特殊数据结构。索引存储特定字段的值或一组字段的值,然后按索引的值进行排序。排序的索引项支持高效相等匹配和基于范围的查询操作。此外,MongoDB 可以通过使用索引中的顺序返回排序后的结果。
下面的关系图阐述了使用索引的方法排序输出匹配的文档。
从根本上讲,在 MongoDB 中的索引类似于其他数据库系统中的索引。MongoDB 定义集合级别的索引并支持文档中任何字段或子字段的索引。
MongoDB使用B-tree的数据结构。
索引类型
MongoDB 提供了大量不同的索引类型,以支持特定类型的数据和查询。
Default _id
默认的_id
所有 MongoDB 集合都有一个索引即 _id ,该字段是默认存在的。如果应用程序不指定 _id 的值, 那么driver(驱动) 或 mongod 将自己创建带有 ObjectId 值的 _id 字段。
_id 是唯一索引,将阻止客户端插入两个 _id 值相同的文档。
除了 MongoDB 自定义的 _id 索引,MongoDB 还支持用户对文档中单个字段定义为升序或降序索引。
对于单字段的索引和排序操作,索引键的排序顺序 (即升序或降序) 并不重要,因为 MongoDB 可以任一方向遍历索引。
MongoDB 还支持用户对多个字段进行索引,即复合索引。
在复合索引中列出的字段的顺序是有意义的。例如,如果复合索引包含 { userid:1,score:-1} ,索引首先通过 userid 进行排序,然后,在每个 userid 的基础上,再score进行排序。
对于复合索引和排序操作,索引键的排序顺序 (即升序或降序) 可以确定索引是否可以支持排序操作。
MongoDB 对存储在数组中的内容使用 multikey 索引。如果进行索引的字段是存放数组内容,MongoDB 为数组中每个元素创建单独的索引项。这些 multikey 索引允许查询数组中匹配一个元素或多个元素的文档。MongoDB 自动确定是否要创建一个 multikey 的索引,如果索引的字段包含数组值,你不需要显式指定 multikey 类型。
Geospatial Index
地理空间索引
为了支持地理空间坐标数据的高效查询,MongoDB 提供了两种特殊的索引 ︰ 2d indexes(使用平面几何时返回的结果)和 2sphere indexes(使用球面几何来返回结果)。
Text Indexes
全文索引
MongoDB 提供支持集合中搜索字符串内容的文本索引类型。这些文本索引不存储特定语言的停止词 (如"the","a","or") 和集合中的关键词,仅能存储词根的单词。
Hashed Indexes
哈希索引
为了支持基于哈希分片,MongoDB 提供哈希的索引类型,可以对字段中的哈希值进行索引。这些索引沿着他们的范围随机值分配不同的值,但只支持相等匹配,不能支持基于范围的查询。
索引属性
Unique Indexes
唯一索引
独特属性的索引会导致 MongoDB 拒绝重复的索引字段值。除了独特的约束,唯一索引与其他 MongoDB 索引是可以互换的。
Partial Indexes(New in version 3.2.)
部分索引(在最新的3.2版中存在)
部分索引只索引文件集合中符合指定过滤表达式的文档。通过索引文件集合中的一个子集,来降低索引创建和维护过程中的存储要求和性能成本消耗。
部分索引提供超集的稀疏索引的功能,应该优先于稀疏索引(Sparse Indexes)。
Sparse Indexes
稀疏索引
索引的稀疏属性可确保索引只包含有索引的字段的文档中的条目。该索引跳过文档中不包含索引字段的内容。
你可以结合稀疏索引选项与唯一索引选项避免文档中字段具有重复值,但是忽略没有索引键的文档。
TTL Indexes
TTL索引
TTL 索引是一种特殊的索引, MongoDB 可以使用并在适当时间后自动删除集合中的文档。这对于某些类型的信息存储是比较合理的,比如生成事件数据、 日志和会话信息等,只需要在数据库中存储有效的一段时间即可。
索引的使用
索引可以提高查询效率。
Covered Queries
覆盖查询
当查询条件和查询的投影条件仅包含索引的字段时,MongoDB 将不扫描任何文档或将文件引入内存,而是直接从索引返回结果。这些覆盖的查询效率是非常高的。
Index Intersection
索引交集(在新版2.6中)
MongoDB 可以使用索引交集的来完成查询。对于指定复合查询条件的查询,如果一个索引可以满足查询条件的一部分和另一个索引可以满足另一部分的查询条件,那么 MongoDB 可以使用两个索引的交集来完成查询。使用复合索引或索引的交集是否更有效率取决于特定的查询和系统。
限制
索引也可以有某些限制,比如设置索引键的长度或者每个集合中索引的数量。