(3)mongodb的学习使用_MongoDB 索引 explain 分析查询速度

本文深入探讨MongoDB的索引创建、使用及优化策略。从基础索引开始,讲解批量数据处理、复合索引、唯一索引的创建方法,以及如何通过explain分析查询效率。此外,还介绍了索引参数设置和在大数据排序场景下的应用。
摘要由CSDN通过智能技术生成
一、索引基础
 

批量添加数据,测试有索引的速度

for(var i=0; i<6000000;i++){ db.shop.insert({"id":i,"title":"shop"+i,"from":"China"})}

创建索引命令
 
db.user.ensureIndex({"username":1})
db.user.createIndex ({"username":1})
注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
 
获取当前集合的索引:
 
db.user.getIndexes()
 
删除索引的命令是:
 
db.user.dropIndex({"username":1})
 
创建 复合索引
数字 1 表示 username 键的索引按升序存储, -1 表示 age 键的索引按照降序方式存储。
db.user.ensureIndex({"username":1, "age":-1})
 
该索引被创建后,基于 username age 的查询将会用到该索引,或者是基于 username
的查询也会用到该索引, 但是只是基于 age 的查询将不会用到该复合索引。因此可以说,
如果想用到复合索引,必须在查询条件中包含复合索引中的前 N 个索引列 。然而如果查询
条件中的键值顺序和复合索引中的创建顺序不一致的话, MongoDB 可以智能的帮助我们调
整该顺序,以便使复合索引可以为查询所用。如:
db.user.find({"age": 30, "username": "stephen"})
对于上面示例中的查询条件, MongoDB 在检索之前将会动态的调整查询条件文档的顺
序,以使该查询可以用到刚刚创建的复合索引。
 
对于上面创建的索引, MongoDB 都会根据索引的 keyname 和索引方向为新创建的索引
自动分配一个索引名, 下面的命令可以在创建索引时为其指定索引名 ,如:
db.user.ensureIndex({"username":1},{"name":"userindex"})
 
随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用 sort
MongoDB 需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以
致无法在内存中进行排序,此时 MongoDB 将会报错。
二、唯一索引
db.user.ensureIndex({"userid":1},{"unique":true})
如果再次插入 userid 重复的文档时, MongoDB 将报错
db.user.dropIndex({"userid":1})
我们同样可以创建复合唯一索引,即保证复合键值唯一即可
db.user.ensureIndex({"userid":1,"age":1},{"unique":true})
 
三、索引的一些参数
 
先删除刚刚创建的唯一索引。
 
四、使用 explain  db.shop.find({"id":999999}).explain()
 
 
五、 explain executionStats 查询具体的执行
时间
explain executionStats 查询具体的执行
db.tablename.find().explain( "executionStats" )
关注输出的如下数值: explain.executionStats.executionTimeMillis
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值