资讯专栏INFORMATION COLUMN

采用Seek Method加速分页

468122151 / 1397人阅读

摘要:整个代码形似代码它的原理很简单,其实就是利用可以利用的来加速分页。需要提醒的是,上需要有才有意义,而且它可以有多列采用这种方式的分页可以避免上述分页的潜在危险当页数达到一定量之后,分页速度会严重下降。

凡事做过页面的,一般对分页不会陌生,也不会觉得它有多难:就是limit + offset的组合就可以了呀。但是,危险往往都是从最不起眼的地方开始的。在这里,我先说一下我之前在用MongoDB时遇到的问题。这类问题同样会出现在这种分页方式上。

当时,我需要对于MongoDB中的数据进行处理,每次处理一批,也相当于是按页来操作数据啦。这个没啥难度,直接使用API中的find + skip + limit就可以轻易搞定。迅速把程序写完之后就开始拿产品库开搞了。刚开始一切正常,可过了没多久,就发现整个程序的性能下降了。进入Mongo一查,发现是Table Scan。哇,那个collection中有上千万的数据啊!

此处略去3000字。

总之,问题最后解决了,程序又运行如飞。而解决之道很简单:只用find + limit,不再使用skip(原因自己想)。只不过在find中加了一个条件:上一批的最后一个document的_id。整个代码形似(groovy代码):

if (docId) {
    batch = collection.find(["_id": ["$gt": docId]] as Document).limit(BATCH_SIZE)
} else {
    batch = collection.find().limit(BATCH_SIZE)
}
docId = batch[-1]["_id"]

它的原理很简单,其实就是利用可以利用的index来加速分页。这种思想跟今天看到的文章的思路如出一辙,不再使用offset,寻找能达到同样效果的index,用它来助力搜索。因此,文中给出的方案跟上面的代码类似:

SELECT ...
  FROM ...
 WHERE ...
   AND id < ?last_seen_id
 ORDER BY id DESC
 FETCH FIRST 10 ROWS ONLY

这种分页方式被称为“seek method”,其中的id被称为“seek predicate”。典型的seek predicate还可以是日期。需要提醒的是,seek predicate上需要有index才有意义,而且它可以有多列!采用这种方式的分页可以避免上述分页的潜在危险:当页数达到一定量之后,分页速度会严重下降。

关于seek method,还可以参考下面的文章:

https://blog.jooq.org/2013/10...

http://use-the-index-luke.com...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18948.html

相关文章

  • Spring Boot学习笔记(六)结合MyBatis实现较为复杂的RESTful API

    摘要:前两篇已经构建了标准工程实例,也整合了实现了简单数据库访问,本篇主要更深入的学习下,实现较为完整的数据库的标准服务。到这里,最复杂的数据访问基本就算编写完了。 前两篇已经构建了RESTful API标准工程实例,也整合了MyBatis实现了简单数据库访问,本篇主要更深入的学习下,实现较为完整的数据库CRUD的标准服务。 首先看下要实现的效果吧,完成下面截图部分的API,除了CRUD之外...

    CntChen 评论0 收藏0
  • Java IO (三) 读取其他进程数据,RandomAccessFile,序列化和反序列化

    摘要:虚拟机读取其他进程的数据对象的方法可以运行平台上的其他程序该方法产生一个对象对象代表由该程序启动启动的子进程类提供如下三个方法用于和其子进程通信获取子进程的错误流获取子进程的输入流获取子进程的输出流这里的输入流输出流容易混淆从程序的角度思考 Java虚拟机读取其他进程的数据 Runtime对象的exec方法可以运行平台上的其他程序,该方法产生一个Process对象,Process对象...

    zhangfaliang 评论0 收藏0
  • android ijkplayer c层分析-初始化(续1 java层与c层衔接)

    摘要:初始化的过程上一篇其实并未完全分析完,这回接着来。层的函数中,最后还有的调用,走的是层的。结构体如下的和,以及,其余是状态及的内容。整个过程是个异步的过程,并不阻塞。至于的东西,都是在层创建并填充的。 初始化的过程上一篇其实并未完全分析完,这回接着来。java层的initPlayer函数中,最后还有native_setup的调用,走的是c层的IjkMediaPlayer_native_...

    Olivia 评论0 收藏0
  • 关于WEB前后端分离的要点总结(上)

    摘要:前言对于前后端分离大家可能在网上可以找到很多的文章。但是,我们今天分享的文章的英文我们的老师对于前后端的分离问题的多年工作经验的总结。今天,我们把这些经验总结知识点分享给大家,希望可以帮助到大家。添加开启黑白名单,任选其一。 前言 对于前后端分离大家可能在网上可以找到很多的文章。但是,我们今天分享的文章的英文我们的老师对于前后端的分离问题的多年工作经验的总结。今天,我们把这些经验总结知...

    FullStackDeveloper 评论0 收藏0

发表评论

0条评论

468122151

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<