![e7ddd4b2a5629d52f6b4c5f2c7cc5810.png](https://i-blog.csdnimg.cn/blog_migrate/adebcfd20453254749bdc6e08986a358.jpeg)
参考官方文档:
https://docs.mongodb.com/manual/indexes/
在MongoDB 中,索引提供了高效的查询执行。没有索引,MongoDB 必须执行集合扫描,即扫描一个集合的每个文档来选择那些与查询语句匹配的文档。如果对于查询有合适的索引,MongoDB 可以使用索引来限制它必须检查的文档数量。
索引是特殊的数据结构[1],它以易于遍历的形式存储集合数据集的一小部分。 索引存储特定字段或字段集的值,按字段值排序。 索引条目的排序支持等式匹配和基于范围的查询操作。 此外,MongoDB可以使用索引中的顺序返回排序结果。
下图说明了使用索引来选择和排序匹配文档的查询:
![db874990b4673c02564972ae55cda705.png](https://i-blog.csdnimg.cn/blog_migrate/b889cb47e635ee831d231d3a62a5b983.jpeg)
从根本上说,MongoDB中的索引与其他数据库系统中的索引类似。 MongoDB在集合级别定义索引,并支持MongoDB集合中文档的任何字段或子字段上的索引。
默认 _id 索引
MongoDB在创建集合期间在_id字段上创建唯一索引。 _id索引可防止客户端为_id字段插入具有相同值的两个文档。 您不能在_id字段上删除此索引。
注意:
在分片集群中,如果不使用_id字段作为分片键,则应用程序必须确保_id字段中值的唯一性以防止出错。这通常通过使用标准的自动生成的ObjectId来完成。
创建索引
在 mongo shell 中,使用 db.collection.createIndex()
db.collection.createIndex( <key and index type specification>, <options> )
以下示例在name字段上创建单个键降序索引:
db.collection.createIndex( { name: -1 } )
db.collection.createIndex方法仅在尚不存在相同规范的索引时才创建索引。
索引类型
MongoDB提供了许多不同的索引类型来支持特定类型的数据和查询。
单个列
除MongoDB定义的_id索引外,MongoDB还支持在文档的单个字段上创建用户定义的升序/降序索引。
![1d033a43f3138c25ac83a2beec72905b.png](https://i-blog.csdnimg.cn/blog_migrate/d3fd98e1046c5d16cf3ea61cef3fda83.jpeg)
对于单字段索引和排序操作,索引键的排序顺序(即升序或降序)无关紧要,因为MongoDB可以在任一方向上遍历索引。
复合索引
MongDB 支持在多个字段上用户定义的索引
复合索引中列出的字段顺序具有重要意义。 例如,如果复合索引由{userid:1,score:-1}组成,则索引首先按userid排序,然后在每个userid值内按score排序。
![56f537e56a547f6604cef0c0f093a232.png](https://i-blog.csdnimg.cn/blog_migrate/dedb7e52aca22ecf04326be8297c30af.jpeg)
对于复合索引和排序操作,索引键的排序顺序(即升序或降序)可以确定索引是否可以支持排序操作。
多键索引
MongoDB使用多键索引来索引存储在数组中的content。 如果索引的字段包含数组值,MongoDB会为数组的每个元素创建单独的索引条目。 这些多键索引允许查询通过匹配元素或数组的元素来选择包含数组的文档。 如果索引字段包含数组值,MongoDB会自动确定是否创建多键索引; 您不需要显式指定多键类型。
![9bb66f9e0df336cb7a9f806c5dc66303.png](https://i-blog.csdnimg.cn/blog_migrate/9b2ceb293c6ef589fb895aa6e9a61272.jpeg)
空间索引
为了支持对地理空间坐标数据的有效查询,MongoDB提供了两个特殊索引:返回结果时使用平面几何的 2d indexes 和使用球形几何返回结果的 2dsphere indexes。
文本索引
MongoDB提供了一种文本索引类型,支持在集合中搜索字符串内容。 这些文本索引不存储特定于语言的停止词(例如“the”,“a”,“or”),并且 stem 集合中的单词仅存储root词。
hash 索引
为了支持基于sharding的hash,MongoDB 提供了哈希索引类型,字段的索引是hash值。这些索引在其范围内具有更随机的值分布,但仅支持等值匹配且不支持基于范围的查询。
索引属性
唯一索引
索引的唯一属性会导致MongoDB拒绝索引字段的重复值。 除了唯一约束之外,唯一索引在功能上可与其他MongoDB索引互换。
局部索引
局部索引仅索引符合指定过滤器表达式的集合中的文档。 通过索引集合中的文档子集,部分索引具有较低的存储要求,并降低了索引创建和维护的性能成本。
部分索引提供了稀疏索引功能的超集,应该优先于稀疏索引。
稀疏索引
索引的稀疏属性可确保索引仅包含具有索引字段的文档的条目。 索引会跳过没有索引字段的文档。
您可以将稀疏索引选项与唯一索引选项组合,以拒绝具有字段重复值的文档,但忽略没有索引键的文档。
TTL 索引
TTL索引是MongoDB可用于在一定时间后自动从集合中删除文档的特殊索引。 这对于某些类型的信息非常理想,例如机器生成的事件数据,日志和会话信息,这些信息只需要在数据库中持续有限的时间。
索引和排序规则
排序规则允许用户为字符串比较指定特定于语言的规则,例如字母和重音标记的规则。
要对字符串比较使用索引,操作还必须指定相同的排序规则。 也就是说,如果操作指定了不同的排序规则,则具有排序规则的索引不支持对索引字段执行字符串比较的操作。
例如,集合myColl在字符串字段category上具有索引,其中排序规则区域设置为“fr”。
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
以下查询操作(指定与索引相同的排序规则)可以使用索引:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
但是,以下查询操作(默认情况下使用“simple”二进制对照)无法使用索引:
db.myColl.find( { category: "cafe" } )
对于索引前缀键不是字符串,数组和嵌入文档的复合索引,指定不同排序规则的操作仍然可以使用索引来支持对索引前缀键的比较。
例如,集合myColl在数字字段score , price 和字符串字段category上有一个复合索引; 使用排序规则区域设置“fr”创建索引以进行字符串比较:
db.myColl.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )
下面的操作,对于字符串比较使用simple 二进制规则,可以使用索引:
db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
以下操作使用“simple”二进制排序规则对索引category字段进行字符串比较,可以使用索引仅查询满足score:5的部分:
db.myColl.find( { score: 5, category: "cafe" } )
被涵盖的查询
当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。 这些覆盖的查询可以非常有效。
![05b1d0c0eb4c7d37c7504b21148ea467.png](https://i-blog.csdnimg.cn/blog_migrate/cbc2de286b3956f562e4e572f09d2dcb.jpeg)
---这就是oracle 中仅仅只扫描索引,无回表操作。