MongoDB 官方文档笔记之索引 Indexes
date
slug
mongodb-doc-indexes
status
Published
tags
MongoDB
summary
type
Page
查看当前 db 索引
单字段索引 single field

在单个字段上创建索引,1表示升序,-1表示降序。
对于单字段索引来说,指定升序降序无关紧要,查询时选择升序降序性能是一样的。
但对于复合索引来说,查询需要符合索引的顺序才能走上索引。
嵌入式文档的内部字段上的索引
什么是嵌入式字段?就是这个字段的值也是一个文档。MongoDB 支持在嵌入式文档的内部字段上建立索引
在嵌入式文档本身建立的索引
还拿上面例子来讲,可以直接在 location 上面建立索引
复合索引 compound

在多个字段上建立的索引,需分别指定每个字段的升降序规则。查询时需要符合升降序规则或符合反向规则,才能走上索引。
复合索引最多只能支持32个字段。
复合索引支持前缀查询。
复合索引的索引顺序
索引以升序(1)或降序(-1)排序顺序存储对字段的引用。对于单字段索引,键的排序顺序无关紧要,因为 MongoDB 可以在任一方向上遍历索引。但是,对于复合索引,属性的顺序决定了索引是否支持结果集的排序。
复合索引中的前缀索引
多键索引 multikey

支持对数组元素内的字段做索引。
但mongodb限制不可以在过个数组上做复合索引。
文本索引 text
MongoDB 提供文本索引以支持对字符串内容的文本搜索查询。text 索引可以包含任何值为字符串或字符串元素数组的字段。
文本索引还可以设置支持的语言、控制相关性分数权重排序、限制条目等,更多查看 https://www.mongodb.com/docs/manual/core/index-text/
通配符索引
有时查询的维度可能不固定,会按照多个字段去查询
2dsphere 和 2d 索引
分别是对计算类似地球的球体上的几何形状的查询的索引,和对存储为二维平面上的点的数据使用2d 索引
索引特性
unique 唯一索引
唯一索引确保索引字段不会存储重复值,默认情况下,MongoDB 在创建集合期间在 _id 字段上创建一个唯一的索引。
partial 部分索引
只对满足指定筛选器表达式的文档做索引,这样索引量更少,性能更高。
sparse 稀疏索引
只对含有索引字段的文档建立索引,字段值是空值也建立。
与之对应的非稀疏索引,则是会对空缺字段存储空值。
由于稀疏索引中有部分文档未被计入索引中,所以在稀疏索引上count查询不准确
其他索引特性:
- ttl 有效期索引
- 不区分大小写索引
索引交叉 Index Intersection
指同时利用多个索引
索引交集跟复合索引很像:复合索引性能更高,要求更严格。索引交叉性能差一些,但更灵活。
但有一种情况不能走索引交叉:当查询需要排序时,而排序字段不在查询谓词(查询字段)中时,无法利用索引交集。
换句话说,只有在查询谓词中的字段能够组成索引交集的,才能利用索引交集。
业务中使用复合索引还是索引交集,需要取决于系统具体情况。
管理索引,索引的增删查改
衡量索引的使用情况
db.collection.explain()
查看执行计划
db.people.find({ name: "John Doe", zipcode: { $gt: "63000" } }).hint( { zipcode: 1 } )
强制走某索引
索引策略:索引的使用和排序
字符串比较时,需要考虑字符串的字符集,需要与建立索引时一致才能走索引。
排序时,也符合前缀匹配
复合索引支持正模式与反模式