MongoDB(四)索引基本介绍以及索引的基本操作crud

MongoDB 索引

官方文档:https://docs.mongodb.com/manual/indexes/

简介:

索引支持MongoDB中查询的高效执行。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择那些匹配查询语句的文档。如果一个查询存在适当的索引,MongoDB可以使用该索引来限制它必须检查的文档数量。

索引是一种特殊的数据结构[1],它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段的值排序。索引条目的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB可以通过使用索引中的排序返回已排序的结果。

基本上,MongoDB中的索引与其他数据库系统中的索引相似。MongoDB在集合级别定义索引,并支持在MongoDB集合中文档的任何字段或子字段上创建索引。

MongoDB在创建集合时在_id字段上创建一个唯一的索引。_id索引防止客户端为_id字段插入两个具有相同值的文档。不能删除__id字段上的索引。

MongoDB索引使用B-tree数据结构

本文档示例数据:

db.col00.insertMany(
[
    {userId: 1, name:'doc01',age:101,status:'open',permissions:['insert'],son:{name:'son1', age:11}, createTime: new Date()}, 
    {userId: 2, name:'doc02',age:102,status:'open',permissions:['insert'],son:{name:'son1', age:12}, createTime: new Date()},
    {userId: 3, name:'doc02',age:102,status:'open',permissions:['insert'],son:{name:'son1', age:12}, createTime: new Date()},
    {userId: 4, name:'doc03',age:103,status:'open',permissions:['insert'],son:{name:'son1', age:13}, createTime: new Date()},
    {userId: 5, name:'doc03',age:103,status:'open',permissions:['insert'],son:{name:'son1', age:13}, createTime: new Date()},
    {userId: 6, name:'doc04',age:104,status:'open',permissions:['insert'],son:{name:'son1', age:14}, createTime: new Date()},
    {userId: 7, name:'doc05',age:105,status:'open',permissions:['insert'],son:{name:'son1', age:14}, createTime: new Date()}
]
, {})

索引的管理crud

# 创建索引 (1表示正序,-1 表示倒序)
mymongo> db.col00.createIndex({"name": -1})
name_-1
mymongo> db.col00.createIndex({"name": 1})
name_1

# 创建索引指定索引名称(加可选参数name)
mymongo> db.col00.createIndex({name: -1}, {name: "nameIndex"})
nameIndex

# 创建一个复合索引
mymongo> db.col00.createIndex({name: -1, age: 1})
name_-1_age_1


# 查看集合中所有的索引
mymongo> db.col00.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { name: -1 }, name: 'name_-1' },
  { v: 2, key: { name: 1 }, name: 'name_1' }
]

# 查看集合中索引的大小
mymongo> db.col00.totalIndexSize()
77824

# 删除集合指定索引
mymongo> db.col00.dropIndex("name_-1")
{ nIndexesWas: 3, ok: 1 }

# 删除集合所有的索引(主键索引不能删除)
db.col00.dropIndexes()
{
  nIndexesWas: 2,
  msg: 'non-_id indexes dropped for collection',
  ok: 1
}

# 查询指定使用索引 cursor.hint()
mymongo> db.col00.find().hint("name_1")
# 或者
mymongo> db.col00.find().hint({name: 1})

# 查看 游标的查询执行计划 cursor.explain()
mymongo> db.col00.explain().find().hint({name: 1})
# 或者
mymongo> db.col00.find().hint({name: 1}).explain()

# 重建集合上的所有现有索引
mymongo> db.col00.reIndex()
{
  nIndexesWas: 1,
  nIndexes: 1,
  indexes: [ { v: 2, key: { _id: 1 }, name: '_id_' } ],
  ok: 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值