#昊鼎王五:如何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查询优化,是不是很欢喜 _
还有其他问题的可以在评论区留言或者扫码加博主获取资源或者提问。