常用¶
索引类型:
1. 单键索引
2. 复合索引
3. 多键索引
4. 地理空间索引
5. 全文索引
6. 哈希索引
7. 模糊索引 (Wildcard Index),一种基于匹配规则的灵活式索引,在 4.2 版本开始引入
索引属性:
1. 唯一索引
2. 稀疏索引(Sparse Indexes)
3. 局部索引(Partial Indexes)
4. TTL索引
索引的优点:
1. 减少数据扫描:避免全表扫描代价
2. 减少内存计算:避免分组排序计算
3. 提供数据约束:唯一和时间约束性
索引的缺点:
1. 增加容量消耗:创建时需额外存储索引数据
2. 增加修改代价:增删改都需要维护索引数据
3. 索引依赖内存:会占用极其宝贵的内存资源
索引类型详解¶
一、单键索引:
在一个键上创建的索引就是单键索引,单键索引是最常见的索引,如MongoDB默认创建的_id的索引就是单键索引。
二、复合索引:
在多个键上建立的索引就是复合索引
三、多键索引:
如果在一个值为数组的字段上面创建索引, MongoDB会自己决定,是否要把这个索引建成多键索引
四、地理空间索引:
MongoDB支持几种类型的地理空间索引。
其中最常用的是 2dsphere 索引用于地球表面类型的地图和 2d 索引用于平面地图和时间连续的数据
五、全文索引:
全文索引用于在文档中搜索文本,我们也可以使用正则表达式来查询字符串
但是当文本块比较大的时候,正则表达式搜索会非常慢,而且无法处理语言理解的问题如 entry 和 entries 应该算是匹配的。
使用全文索引可以非常快地进行文本搜索,就如同内置了多种语言分词机制的支持一样。
创建索引的开销都比较大,全文索引的开销更大。创建索引时,需后台或离线创建
六、哈希索引:
哈希索引可以支持相等查询,但是 哈希 索引不支持范围查询。
您可能无法创建一个带有 哈希 索引键的复合索引或者对 哈希 索引施加唯一性的限制。
但是,您可以在同一个键上同时创建一个 哈希 索引和一个递增/递减(例如,非哈希)的索引,
这样MongoDB对于范围查询就会自动使用非哈希的索引
索引属性选项配置¶
一)options全局选项(适用于所有索引):
1. background Boolean
建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。
“background” 默认值为false。
2. unique Boolean
建立的索引是否唯一。指定为true创建唯一索引。
默认值为false.
3. name string 索引的名称
如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
不能超过128字符
4. partialFilterExpression Document
设定索引只对满足条件的文档起作用 具体见官网对Partial Indexes
5. sparse Boolean
对文档中不存在的字段数据不启用索引;
这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.
默认值为 false.
6. expireAfterSeconds integer
指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
7. storageEngine Document
允许用户在创建索引时指定每一个索引的配置
二)全文文本索引选项:
参数名 类型 描述
weights document 设置文本索引字段的权重,权重值1- 99,999
default_language 设置文本分词的语言,默认为english,其他支持语言
language_override string 使用文档中的一个字段的值作为设置文本分词的语言,默认为language,例子
textIndexVersion integer 版本号,可以是1或2
注意事项¶
创建索引,需要考虑的问题:
每个索引至少需要数据空间为8kb
添加索引会对写入操作会产生一些性能影响
对于具有高写入率的集合Collections,索引很昂贵,因为每个插入也必须更新任何索引
索引对于具有高读取率的集合Collections很有利,不会影响没索引查询
处于索引处于action状态时,每个索引都会占用磁盘空间和内存,因此需要对这种情况进行跟踪检测
索引限制:
索引名称长度不能超过128字段
复合索引不能超过32个属性
每个集合Collection不能超过64个索引
不同类型索引还具有各自的限制条件
MongoDB度量标准(@tovalidate):
metrics.queryExecutor.scanned
在查询和查询计划评估期间扫描的索引项的总数
metrics.operation.scanAndOrder
返回无法使用索引执行排序操作的已排序数字的查询总数
collStats.totalIndexSize
所有索引的总大小。 scale参数会影响此值。
如果索引使用前缀压缩这是WiredTiger的默认值,则返回的大小将反映计算总计时任何此类索引的压缩大小。
collStats.indexSizes
指定集合collection上每个现有索引的键和大小。 scale参数会影响此值
dbStats.indexes
包含数据库中所有集合的索引总数的计数。
dbStats.indexSize
在此数据库上创建的所有索引的总大小