MongoDB索引

MongoDB索引

Administrator 35 2021-05-20

索引提高查询速度,降低写入速度,权衡常用的查询字段,不建议在太多列上建索引。在mongodb中,索引可以按字段升序/降序来创建,便于排序。默认是用btree来组织索引文件,也允许建立hash索引。

# 在test库下stu下创建10000行数据的成绩表
for (var i=1;i<=10000;i++){
	db.stu.insert({sn:i,name:'stu'+i,email:'stu'+i+'@126.com',score:{yuwen:i%80,shuxue:i%90,yingyu:i%100}})
}

1. 普通索引

1. 单列索引

在表stu创建sn列索引

db.stu.ensureIndex({sn:1})

1表示升序,-1表示降序

2. 多列索引

在表stu创建sn列和name列共同索引

db.stu.ensureIndex({sn:1,name:1})

1表示升序,-1表示降序

3. 子文档索引

在表stu的score列下的yuwen字段创建索引

db.stu.ensureIndex({‘score.yuwen’:1})

1表示升序,-1表示降序

2. 唯一索引

创建唯一索引后字段值都是唯一的

在表stu创建email列索引

db.stu.ensureIndex({email:1},{unique:true})

3. 稀疏索引

稀疏索引的特点:如果针对field做索引,针对不含field列的文档,将不建立索引。与之相对的普通索引会把该文档的field列的值认为NULL,并建索引。

使用场景:小部分文档含有某列时。

在表stu创建phone列稀疏索引

db.stu.ensureIndex({age:1},{sparse:true})

4. 哈希索引

哈希索引速度比普通索引快,缺点是不能对范围查询进行优化。使用场景:随机性强的散列

在表stu创建email列哈希索引

db.stu.ensureIndex({email:‘hashed’})

5. 重建索引

一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此。可以通过索引的重建,减少索引文件碎片,并提高索引的效率,类似mysql中的optimize table

在表stu重建索引

db.stu.reIndex()

6. 删除索引

# 语法
db.collection.dropIndex({filed:1/-1});

# 示例
db.stu.dropIndex({sn:1})
db.stu.dropIndex ({email:'hashed'})

7. 查看索引和执行计划

# 查看表索引
db.stu.getIndexes()

# 查看执行计划
db.stu.find({sn:5555}).explain() # 默认只输出queryPlanner

# 其中explain()参数有三个,分别是'queryPlanner'、'executionStats'、'allPlansExecution'
db.stu.find({sn:5555}).explain('executionStats')

# explain分析结果的几个重要字段,通过结果分析可以判断是否需要优化执行语句

executionStats属性下的字段:

  • executionTimeMillis:查询耗时,单位(ms)
  • totalDocsExamined:扫描文档数
  • executionStages.stage:”COLLSCAN”表示全表扫描,”FETCH”表示索引扫描
  • executionStages. executionTimeMillisEstimate:索引扫描耗时,单位(ms)

winningPlan.inputStage属性下的字段:

  • indexName:索引名字