《MongoDB权威指南(第2版)》章节试读

出版社:人民邮电出版社
出版日期:2014-1-1
ISBN:9787115341082
作者:霍多罗夫 (Kristina Chodorow)
页数:390页

《MongoDB权威指南(第2版)》的笔记-第70页 - 4.5.2 避免使用skip略过大量结果

用skip略过少量的文档还是不错的。但是要是数量非常多的话,skip就会变得很慢,因为要先找到需要被略过的数据,然后再抛弃这些数据。大多数数据库都会在索引中保存更多的元数据,用于处理skip,但是MongoDB目前还不支持,所以要尽量避免略过太多的数据。通常可以利用上次的结果来计算下一次查询条件项目当中模拟插入了120W条数据,在同一个文档当中单纯查询数据的速度还不错,主要是对查询的文档字段添加了索引,但是对查询结果的前台分页确有问题。具体来说是不设置任何查询条件的时候,会查询出来将近120W条满足条件的结果,使用mongodb的limit()和skip() 来取出来 第一页前20条数据,这样在后台的java程序当中只是这20条数据占用内存。
代码具体形式类似于用mongodb客户端执行
db.feedbackInfo.find(criteria).skip(0).limit(20) 获得第一页0-20条数据
db.feedbackInfo.find(criteria).skip(20).limit(20) 获得第二页20-40条数据
……
db.feedbackInfo.find(criteria).skip(N).limit(20) 获得第二页N-N+20条数据
但问题在于随着不断翻页,skip的值N会越来越大,前台的反应越来越慢。很直接的一个表现就是在前台从第一页直接跳转进入最后一页根本反应不过来。
对于这个实际问题,原因就是本书这里所言的skip略过大量结果会带来性能问题,再根源地说是mongodb还不够完善,索引本身还比较简单。
具体的这个分页效率的问题,有两种思路:
第一,等mongodb升级,优化这个skip的执行效率。
第二,不用skip()而实现分页效果。这个思路的基础就是mongodb本身对于where查询和limit()的效率还比较不错,也就是本来分页的那个查询用where和limit速度还可以的前提(一般就是需要建立必要的索引)。假如这个前提不成立,那没法讨论。
本书接下来具体讨论了不使用skip对结果分页的实现例子,这个本质是对信息系统增加一个查询中间量——上次查询的业务数值,在逻辑上承担起跟skip相对等价的功能。
比如说是第一页查询是按照一个日期date值查询,第一次用
db.foo.find().sort({"date",-1}).limit(20)
而点击下一页的时候,事先将上次查询的date的边界值给传递过去,第二页查询的时候就使用新的find条件查询
db.foo.find({"date":{"$gt":latest.date}}); 而后再对查询结果排序即可
这种绕过skip的方式评价:
第一,很难比较方便地解决所有的分页问题,简单来说 对于使用正则表达式的查询,根本无法通过记录边界条件来实现。
第二,不得不多传递上次查询的那个边界条件,增加了工作量,不够优雅。
第三,只能够解决一页一页往下翻页的问题,如果我要从第1页直接跳到100页,就束手无策


 MongoDB权威指南(第2版)下载 更多精彩书评


 

农业基础科学,时尚,美术/书法,绘画,软件工程/开发项目管理,研究生/本专科,爱情/情感,动漫学堂PDF下载,。 PDF下载网 

PDF下载网 @ 2024