mongodb索引
索引的作用
索引支持在MongoDB中有效地执行查询。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择那些与查询语句匹配的文档。如果一个查询存在适当的索引,MongoDB可以使用该索引来限制它必须检查的文档数量。
索引是特殊的数据结构,它以一种易于遍历的形式存储集合数据集的一小部分。索引存储一个或一组特定字段的值,按字段的值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB可以通过使用索引中的排序返回排序后的结果。
索引
默认id索引
mongo默认创建的_id索引,_id字段一般用mongo自动生成的id,而不需要插入时手动创造
在分片群集中,如果您不使用_id字段作为分片键,那么您的应用程序 必须确保_id字段中值的唯一性以防止错误。这通常是通过使用标准的自动生成的ObjectId来完成的。
索引创建
在mongo shell中使用 db.集合.createIndex()
创建索引
以下示例在name字段上创建单个键降序索引:
db.collection.createIndex( { name: -1 } )
索引名称
索引的默认名称是索引键和索引中每个键的方向(即1或-1)的连接,使用下划线作为分隔符。例如,在 { item : 1, quantity: -1 }上创建的索引名称为item1_quantity-1 。
可以在创建索引时指定索引名:
db.products.createIndex(
{ item: 1, quantity: -1 } ,
{ name: "query for inventory" }
)
[!important]
索引一旦创建,无法修改,包括索引名
索引类型
MongoDB提供了许多不同的索引类型来支持特定类型的数据和查询。
- 单字索引
指在文档中的单个字段上创建索引
对于单字段索引和排序操作,索引键的排序顺序(升序或降序)并不重要,因为MongoDB可以从任何方向遍历索引。
- 复合索引
指使用多个用户定义字段创建的索引(类似mysql的联合索引),与mysql联合索引类似,必须有序的使用索引。
删除冗余索引
如果集合同时具有复合索引和前缀索引(例如 { a: 1, b: 1 } 和 { a: 1 }),并且两个索引都没有稀疏或唯一约束,则可以删除前缀索引 ({ a: 1 })。MongoDB 在所有需要使用前缀索引的情况下都使用复合索引。
复合索引的排序必须按照索引的顺序和方向,如{ a: 1, b: -1 } 则只能支持一下索引查询
- 查询a的升序(不查询b)
- 查询a的升序,b的降序(与索引方法一致):a的降序,b的升序,需要考虑能否支持
- 指定a,查询b的降序(注意这里不支持查询b的升序)
- 多键索引
多键索引是mongo用来索引在数据中的内容的索引。如果索引包含数组值的字段,MongoDB为数组的每个元素创建单独的索引项。这些多键索引允许查询通过匹配数组的一个或多个元素来选择包含数组的文档。MongoDB自动决定是否创建一个多键索引,如果索引字段包含数组值;您不需要显式地指定多键类型。
- 地址空间索引
Mongo支持的一种特殊索引,支持对使用平面几何的2d索引和使用球面几何返回结果的2dsphere索引。
- 文本索引
https://chatgpt.com/s/t_685656f2a2608191ab47d328a77e736f
- hashed索引
指对key的内容hash之后做索引,hash索引只支持等值匹配,不支持范围查询,常用于作为分片键。
索引属性
- 唯一索引
唯一索引用于规划这个key对应的值在集合(table)中只能出现一次,一个集合里面可以有多个唯一索引,唯一索引对应的key如果不存在则不进行索引,只保证存在的文档中对应key不重复。
- 部分索引
部分索引仅索引集合中符合指定过滤器表达式的文档。通过对集合中的部分文档建立索引,部分索引可以降低存储需求,并降低创建和维护索引的性能成本。
部分索引提供了稀疏索引功能的超集,因此应优先于稀疏索引。
https://chatgpt.com/s/t_6856588847ac819183546a5583026345
- 稀疏索引
索引的稀疏属性可确保索引仅包含具有索引字段的文档的条目。索引会跳过没有索引字段的文档。
- TTL索引
自动过期索引
索引查询
- 覆盖查询
类似mysql的覆盖索引,如果索引字段包含查询字段,则可以直接返回索引的数据,而不用回表查询。
https://chatgpt.com/s/t_68565a662a208191a66a97fac05ed587
- 索引交集
MongoDB可以使用索引的交集来完成查询。对于指定复合查询条件的查询,如果一个索引可以满足查询条件的一部分,而另一个索引可以满足查询条件的另一部分,则MongoDB可以使用两个索引的交集来满足查询。使用复合索引还是使用索引交集是否更有效取决于特定查询和系统。