昊鼎王五:如何MongoDB查询优化?

#昊鼎王五:如何MongoDB查询优化?

MongoDB 查询优化

#1.在查询条件、排序条件、统计条件的字段上选择创建索引,可以显著提高查询效率。
比如:创建唯一索引

db.fs.files.ensureIndex({"filename":1},{"unique":true})

#2.用$or时把匹配最多结果的条件放在最前面,用$and时把匹配最少结果的条件放在最前面。

Criteria().orOperator(Criteria.where("_id").is(newObjectId(projec	tId.toString())

#3.使用limit()限定返回结果集的大小,减少数据库服务器的资源消耗,以及网络传输的数据量。

		query.with(new Sort(new Order(Direction.DESC, "")));
		query.skip((pageable.getPageNumber() - Constants.INT_ONE) * 				pageable.getPageSize());
		query.limit(pageable.getPageSize());
		
#4 尽量少用$in,而是分解成一个一个的单一查询。尤其是在分片上,
$in会让你的查询去每一个分片上查一次,如果实在要用的话,先在每个分片上建索引。

#5. 尽量不用模糊匹配查询,用其它精确匹配查询代替,比如$in、$nin。

db.users.find({'age' : {'$in' : [10, 22, 26]}});

#6. 查询量大、并发大的情况,通过前端加缓存解决。

#7. 只查询要使用的字段,而不查询所有字段。

 	BasicDBObject key=new BasicDBObject("vid",1);//指定需要显示列  
 DBCursor cursor=video_info.find(condition,key); 

#8. 更新字段的值时,使用$inc比update效率高。

    new Query(Criteria.where("id").is(id)), new Update().inc("age", 3)  

#9. apped collections比普通collections的读写效率高。

#10. 必要时使用hint()强制使用某个索引查询。

db.COLLECTION_NAME.find({"TIME.registerdate":{$gte:"2014-04-19" }}).hint("TIME.r	egisterdate_1") 
如果有自己的主键列,则使用自己的主键列作为id,这样可以节约空间,也不需要创建额外的所以。

#11. 使用explain,根据exlpain plan进行优化。

Mongodb提供了一个explain命令,用来查看查询的过程,以便进行性能优化。
    db.users.explain("allPlansExecution").find({username:'user101'})


#12. 范围查询的时候尽量用$in、$nin代替,比如查询id=7,id=8,id=9尽量用$in

 $in 包含
与 sql 标准语法的用途是一样的,即要查询的是一系列枚举值的范围内
查询 x 的值在 2,4,6 范围内的数据
db.things.find({x:{$in: [2,4,6]}});
 $nin 不包含
与 sql 标准语法的用途是一样的,即要查询的数据在一系列枚举值的范围外
查询 x 的值在 2,4,6 范围外的数据
db.things.find({x:{$nin: [2,4,6]}});

#13. 查看数据库查询日志,具体分析的效率低的操作。

#14. mongodb数据库优化工具database profiler,检测数据库操作的性能。可以发现query或者write操作中执行效率低的,从而针对这些操作进行优化。

好了,聪明如你,知道了如何MongoDB查询优化,是不是很欢喜 _

还有其他问题的可以在评论区留言或者扫码加博主获取资源或者提问。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值