uncategorized

Index In MongoDB

MongoDB

索引能减少需要扫描的文档,从而提升查询效率;如果没有索引,查询需要扫描collection中所有document,相比之下多了许多磁盘IO操作。
索引存储了索引字段的值以及目标文档的位置,按所有字段的值有序排列。
MongoDB中索引定义在collection上,可以对字段、嵌套字段应用索引。

默认的_id索引

创建collection时,MongoDB自动对_id字段设置了唯一索引(unique index),这个索引不可以被删除。

索引类型

单字段索引(Single Filed)

1
db.collection.createIndex({ name: 1 })
  • 单字段的索引排序是升序还是降序不重要
  • 嵌套文档的字段可以作为单字段索引
  • 嵌套文档可以作为单字段索引

复合索引(Compound Index)

1
db.collection.createIndex({ name: 1, score: 1 })
  • 多个字段组合成一个索引,字段的先后顺序很重要,升降序也重要
  • 复合索引支持查询索引字段前缀(例如{name: “xx”}, {name: “xx”, score: 80})
  • 排序要使用复合索引需满足:排序字段顺序和索引字段顺序相同;排序字段升降序和索引字段相同或相反
  • 字段数量不能超过32个

多键索引(Multikey Index)

  • 多键索引是针对数组字段的索引,如果在数组字段上创建了索引,MongoDB会自行决定是否创建多键索引。
  • 多键索引可以加速素组元素的查询
  • 多键索引只能包含一个数组字段
  • 新插入的数据不能破坏索引
  • 在包含多键索引的字段上排序时,查询计划会包含阻塞的排序阶段,即排序全部完成后才能输出,会影响性能
  • 不能在shard key上面创建多键索引
  • 哈希索引不能是多键的
  • $expr操作符不支持多键索引
  • 把一个数组字段作为整体来查询时,多键索引支持查询出包含第一个元素的所有文档,再在这些文档中筛选出匹配的文档

地理空间索引(Geospatial Index)

  • 2d平面索引
  • 2d球面索引

文本索引(Text Index)

  • 文本搜索索引

哈希索引(Hashed Index)

  • 对指定字段的哈希值建立的索引
  • 支持基于哈希的Sharding
  • 支持“相等”查询,不支持范围类查询

索引属性

唯一索引(Unique Index)

  • 保证每条记录的唯一性

部分索引(Partial Index)

  • 对满足表达式的部分文档建立索引
  • 减少了建立索引的性能消耗

稀疏索引(Sparse Index)

  • 只对包含索引字段的文档建立索引,是部分索引的子集
  • 可以结合唯一索引来只对包含索引字段的记录保证唯一性

有限时间索引(TTL Index)

  • 在指定时间后删除该索引

覆盖查询(Covered Query)

如果查询字段和映射结果只包含索引字段,MongoDB直接从索引返回结果,不会扫描文档,效率很高。

索引交叉(Index Intersection)

如果一个索引覆盖查询的一部分,另一个索引覆盖查询的另一部分,MongoDB可以同时利用两个索引。

限制

  • 一个索引键大小不能超过1KB
  • 一个collection最多能有64个索引
  • 索引名不能超过128个字符(<database name>.<collection name>.$<index name>)
  • 复合索引字段不能超过32个
  • 不能同时使用文本索引和地理空间索引
  • 地理空间索引的字段只能包含坐标对或GeoJSON形式的数据
  • 覆盖查询返回的NaN的类型总是double类型(WiredTiger)
  • 多键索引不能满足覆盖查询
  • 地理空间索引不能满足覆盖查询
Share