MongoDB 分页查询的skip方法及性能
来源:互联网 发布:java多态的体现 编辑:程序博客网 时间:2024/06/03 15:49
废话不多说,关于入门的资料、安装以及其他请拉到文章末尾,我附上了一些资料,以后如有必要再来分享。这篇文章着重的讲讲MongoDB的分页查询,为啥?分页可是常见的头号杀手,弄不好了,客户骂,经理骂。
传统的SQL分页
传统的sql分页,所有的方案几乎是绕不开row_number的,对于需要各种排序,复杂查询的场景,row_number就是杀手锏。另外,针对现在的web很流行的poll/push加载分页的方式,一般会利用时间戳来实现分页。 这两种分页可以说前者是通用的,连Linq生成的分页都是row_number,可想而知它多通用。后者是无论是性能和复杂程度都是最好的,因为只要简单的一个时间戳即可。
MongoDB分页
进入到Mongo的思路,分页其实并不难,那难得是什么?其实倒也没啥,看明白了也就那样,和SQL分页的思路是一致的。
首先来看看分页需要的参数以及结果,一般的分页需要的参数是:
- PageIndex 当前页
- PageSize 每页记录数
- QueryParam[] 其他的查询字段
所以按照row_number的分页思想,也就是说取第(pageIndex*pageSize)到第(pageIndex*pageSize + pageSize),我们用Linq表达就是:
查找了资料,还真有skip函数,而且还有Limit函数 见参考资料1、2,于是轻易地实现了这样的分页查询:
相当的高效,几乎是几毫秒就出来了结果,果然是NoSql效率一流。但是慢,我这里使用的数据只是10条而已,并没有很多数据。我把数据加到100000,效率大概是20ms。如果这么简单就研究结束了的话,那真的是太辜负了程序猿要钻研的精神了。sql分页的方案,方案可是能有一大把,效率也是不一的,那Mongo难道就这一种,答案显然不是这样的。另外是否效率上,性能上会有问题呢?Redis篇里,就吃过这样的亏,乱用Keys。
在查看了一些资料之后,发现所有的资料都是这样说的:
不要轻易使用Skip来做查询,否则数据量大了就会导致性能急剧下降,这是因为Skip是一条一条的数过来的,多了自然就慢了。
这么说Skip就要避免使用了,那么如何避免呢?首先来回顾SQL分页的后一种时间戳分页方案,这种利用字段的有序性质,利用查询来取数据的方式,可以直接避免掉了大量的数数。也就是说,如果能附带上这样的条件那查询效率就会提高,事实上是这样的么?我们来验证一下:
这里我们假设查询第100001条数据,这条数据的Amount值是:2399927,我们来写两条语句分别如下:
结果已经附带到注释了,很明显后者的性能是前者的三分之一,差距是非常大的。也印证了Skip效率差的理论。
MongoDB会根据查询,来加载文档的索引和元数据到内存里,并且建议文档元数据的大小始终要保持小于机器内存,否则性能会下降。
总结
这篇文章,基于Skip分页和有序字段查询分页两种方案进行的对比。后者说白了只是利用查询结果不用依次数数来提高了性能。Skip虽然效率低一些但是通用一些,有序字段的查询,需要在设计分页的时候对这个字段做一些处理,起码要点了页码能获取到这个字段。这里我附加一个方式,就是两者的结合,我们可以拿每次展示的那页数据上的最后一个,结合Skip来处理分页,这样的话,相对来说更好一些。这里就不具体实现了。其他方式的性能比较和实现,欢迎大牛们来分享,十分感谢。另外本篇中如有纰漏和不足请留言指教。
- MongoDB 分页查询的skip方法及性能
- MongoDB分页查询的方法及性能
- mongodb 分页查询替代skip的方式
- mongodb的分页查询
- MongoDB文档查询-分页查询(limit、skip)与查询结果排序(sort)
- MongoDB 性能优化之分页查询
- MongoDB Limit与Skip方法
- MongoDB Limit与Skip方法
- MongoDB Limit与Skip方法
- 【mongodb】mongodb中的skip指的是什么
- 菜鸟的mongoDB学习---(五)MongoDB的limit、skip、sort方法
- MongoDb的分页查询,游标,存储过程
- MongoDb的分页查询,游标,存储过程
- mongodb查询分页优化
- MongoDB 分页查询
- mongodb查询分页优化
- mongodb 分页查询
- MongoDB之分页查询
- eclipse 汉化方法
- hibernate模板配置
- ubuntu+openlte安装遇到缺少polarssl library的问题
- 高通平台,AP和CP端相关qmi接口,AT命令,NV等porting目录
- 实现一个从底部向上弹出的菜单栏
- MongoDB 分页查询的skip方法及性能
- Android零基础入门第36节:Android系统事件的响应
- eclipse中maven项目部署到tomcat运行
- 第6章 网页解析器和BeautifulSoup第三方插件
- android.os.FileUriExposedException:file:///storage/emulated/0/1502852028434.jpg exposed beyond app t
- css 一列固定一列自适应布局-flex布局实现
- HDU_6127 Hard challenge 【思维】
- img bug 有1px的空白
- Jeecg中通过Spring_AOP+注解方式实现日志的管理