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
}