4、索引
MongoDB索引使用B树 数据结构
4.1 单字段索引
单个字段上创建用户定义的升序/降序,称为单字段索引。建立索引的时候,指定排序方式
其实升序/降序并不重要,因为MongoDB可以再任何方向上遍历索引。
先找到索引,再根据索引去集合中查找
4.2 复合索引
和关系型数据库组合索引一样
4.3 其它索引
-
地理空间索引
提供了两种特殊索引: 1-返回结果时使用平面几何的二维索引; 2-返回结果时使用球面几何的二维球面索引
-
文本索引
支持在集合中搜索字符串内容。 性能不高,通常搭配ES使用
-
哈希索引
分布式分区的时候MongoDB自动有算法。 具体的 TODO
4.4 索引操作
4.4.1 查看索引
// MongoDB 3.0+
db.collection.getIndexes()
// 默认_id索引:
// MongoDB在创建集合的过程中,在 _id 字段上创建一个唯一的索引,默认名字为 id ,该索引可防止客户端插入两个具有相同值的文 档,您不能在_id字段上删除此索引。
// 注意:该索引是唯一索引,因此值不能重复,即 _id 值不能重复的。在分片集群中,通常使用 _id 作为片键
// v:当前MongoDB的索引版本
// key: 索引字段-排序方式
// name: 索引名,默认为 字段名+_
// ns: namespace, 数据库.集合
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "articledb.commect"
}
]
4.4.2 创建索引
Parameter | Type | Description |
---|---|---|
keys | document | {字段1:1或-1, 字段2:1或-1},1为升序,-1为降序 |
options | document | 可选,索引创建选项 |
options选项列表:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,为true可指定以后台方式创建索引。 默认为false |
unique | Boolean | 建立的索引是否唯一。true创建唯一索引。默认为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 3.0+版本已废弃. 在建立唯一索引时是否删除重复记录,true 创建唯一索引。默认为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引; 这个参数需要特别注意,如果为true的话,在索引字段中不会查询出不包含对应字段的文档。默认为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongodb创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认为 language. |
db.collection.createIndex(keys, options)
// 单字段索引示例:对 userid 字段建立索引
db.comment.createIndex({userid:1})
// 复合索引:对 userid 和 nickname 同时建立复合(Compound)索引
db.comment.createIndex({userid:1,nickname:-1})
4.4.3 移除索引
// 所有索引的移除
db.collection.dropIndexes()
// 指定索引的移除
db.collection.dropIndex(index)
// 删除 comment 集合中 userid 字段上的升序索引
db.comment.dropIndex({userid:1})
4.4.4 执行计划
db.collection.find(query,options).explain(options)
// 关键点看: "stage" :
// "COLLSCAN", 表示全集合扫描
// "IXSCAN" ,基于索引的扫描
// 在Compass中查看执行计划更详细
4.4.5 涵盖查询
相当于MySQL的二次查询。
当查询条件和查询的投影仅包含索引字段时, MongoDB直接从索引返回结果, 而不扫描任何文档或将文档带入内存。
这样的查询效率最高。