学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第82篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。
Mongodb与其他数据库类似,当面临大量数据查询时,会出现各种各样的性能问题。本文结合Mongodb的官方文档,整理几个优化Mongodb查询的技巧。
为查询添加索引
为常用的查询建立索引。为多字段查询建立复合索引。当Mongodb执行查询语句时,通过索引查询会比全表扫描快很多。通常,索引的结构也会比文档引用小,而且按照顺序存储。
如有集合posts,用来存储博客发帖信息。如果客户端或应用程序经常按照字段author_name查询,那么可以在author_name字段添加索引来对这个查询进行优化。
db.posts.createIndex({author_name: 1})
索引也能够提高在指定字段的排序效率。如系统中的一个经常执行的查询需要按照timestamp字段排序,那么可以通过在字段timestamp添加索引来进行优化。
db.posts.createIndex({timestamp:1})
添加索引后,类似下面的查询会优化
db.posts.find().sort({timestamp: -1})
Mongodb支持索引的正向和逆向读取。单字段索引的读取顺序对性能没有影响。
索引能够提高查询,数据更新和一些聚合操作的效率。
限制返回数据量,减少网络开销
Mongodb的游标按照分组的形式返回查询结果。如果用户清楚的知道要返回的数据量,用户可以通过添加limit()方法,来限制返回数据的数量,减少网络开销。通查用户的查询和排序一起执行。如下面的操作,用户只返回了posts集合中最新的10条数据。
db.posts.find().sort({timestamp: -1}).limit(10)
仅返回需要的数据
当用户仅需要文档中的部分字段时,通过限制只返回需要的字段能够带来好的性能。如在posts集合中,用户只需要timestamp, title, author和abstract字段,用户可以这样构建查询语句。
db.posts.find({}, {timestamp:1, title:1, author: 1, abstract:1}).sort({timestamp: -1})
使用$hint指定索引查询
大多数情况下,查询优化器能够为指定操作选择合适的索引。但用户可以通过$hint方法,指定Mongodb查询时使用的索引。hint()方法支持性能调试,也能够在查询语句中从多个索引中手动选择一个最优的索引。
使用Mongodb提供的计算操作符,减少操作次数
如使用Mongodb的$inc方法,对字段值增加或减少。这个操作直接发生在Mongodb的进程当中,而不是查询出来,在客户端计算完新的字段,在保存回mongodb。使用这样的操作符,将查询,数据计算和保存的动作合并成一个动作,也减少了不同客户端操作时产生的并发问题。
标签:Mongodb,性能,posts,查询,索引,字段,timestamp,优化 From: https://blog.csdn.net/wilsonzane/article/details/140152334