mongodb 使用索引支持高效的查询,没有索引就必须要扫描整个数据集。
索引是以一种可高效遍历数据的形式(B树)存储的结构,存放着一个或多个字段值,并且按值排序。索引的这种排序支持高效的精确查询或者范围查询,根据索引的排序返回排好序的数据。
以下是使用索引查询病排序的图示:
默认的 _id
索引
mongodb 在 _id 字段上创建唯一索引,这个索引不能删除。
注意:在分片集群中,若_id 不作为shardkey,则必须在应用中保证其唯一性。通常可以用自动生成的 ObjectId
索引的创建
db.collection.createIndex( { name: -1 } )
在name字段上创建一个单key 降序索引
索引名称
默认的索引名称是排序的key的拼接,外加每个key后拼接其排序方式(升序、降序对应1、-1)
如 :{ item : 1, quantity: -1 } 的索引名称是: item_1_quantity_-1
自定义索引名称可以使用:
db.products.createIndex(
{ item: 1, quantity: -1 } ,
{ name: "query for inventory" }
)
可以用 db.collection.getIndexes()
查看索引. 索引一旦创建不可以重命名,必须通过删除索引再重建来重命名。
索引类型
单一字段索引
对单一key的索引而言,顺序不太重要,因为mongodb可以逆序遍历。
更多详见:
复合字段索引
这里的字段顺序就比较重要了,如:{userid: 1, score: -1 },先按 userid
升序排序,在每个 userid
内部,按 userid 降序
更多详见:
多字段索引
用于索引数组内容
当对一个数组字段添加索引时,mongodb为数组每个元素添加一个索引,例如:
更多详见:
更多索引类型:
- Geospatial Index(地理坐标索引),详见 2d Index Internals
- Text Indexes(文本索引),详见:Text Indexes
- Hashed Indexes(哈希索引),对字段值的哈希值做索引,可以更好的分散,但只支持精确匹配不支持范围查询。
索引的特性
- 唯一性,索引字段的值不能重复
- 部分索引(Partial Indexes):根据表达式过滤到的文档建立索引,更少的存储要求,减少了索引创建的性能损耗。是稀疏索引(sparse indexes )的超集,相比后者更建议使用部分索引。
- 稀疏索引(Sparse Indexes):只索引包含该字段的文档
- TTL Indexes:生存时间索引,mongodb会对超出时间的文档进行删除,适合日志类信息的管理
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
索引与文字校对(Indexes and Collation)
校对(Collation)用于指定字符串校验规则
使用这类索引时,查询也要指定相同的校验(collation)规则
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
指定了规则: locale "fr"
以下查询可以使用该索引:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
以下查询则不能用该索引:
db.myColl.find( { category: "cafe" } )
覆盖查询(Covered Queries)
当查询只涉及索引字段时,mongodb 可以直接从索引返回,而不需要扫描文档并导入内存(回表),这样比较高效
索引合并(Index Intersection)
索引合并是:index merge,Intersection 是一种方式
同一个表的多个索引扫描后进行合并
一个复合字段查询,索引a覆盖查询条件一部分,索引b覆盖另一部分,mongodb 使用 索引Intersection 实现查询
更多索引相关详见:
- Index Limitations(索引的限制)
- Operational Considerations for Indexes (索引使用的考虑)
转自:Indexes