MongoDB从入门到放弃(三)

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 创建索引

ParameterTypeDescription
keysdocument{字段1:1或-1, 字段2:1或-1},1为升序,-1为降序
optionsdocument可选,索引创建选项

options选项列表:

ParameterTypeDescription
backgroundBoolean建索引过程会阻塞其它数据库操作,为true可指定以后台方式创建索引。 默认为false
uniqueBoolean建立的索引是否唯一。true创建唯一索引。默认为false.
namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDupsBoolean3.0+版本已废弃. 在建立唯一索引时是否删除重复记录,true 创建唯一索引。默认为 false.
sparseBoolean对文档中不存在的字段数据不启用索引;
这个参数需要特别注意,如果为true的话,在索引字段中不会查询出不包含对应字段的文档。默认为 false.
expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
vindex version索引的版本号。默认的索引版本取决于mongodb创建索引时运行的版本。
weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的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直接从索引返回结果, 而不扫描任何文档或将文档带入内存。

这样的查询效率最高。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值