跨库跨表的分页查询实现

本贴最后更新于 2791 天前,其中的信息可能已经事过境迁

对于数据库分库分表之后,涉及到查询时就会存在一些问题,比如如何分页,如何排序,如何处理函数平均值等等,特别是对于分页功能,需要在应用中将数据合并后进行排序,在显示,还需要考虑应用中翻页的页码与实际库中查询时页码的关系,同时还需要考虑某个库数据查询完毕后,其他库中如何增加每次查询页码的问题,否则查询后的总页数不能满足应用中的页数。

当前GAP平台正在进行组织权限系统的服务化,存在一个统一集中式管理的远端组织权限服务系统,同时也存在一个具体业务系统的本地组织权限,那么当用户登陆到本地业务系统后,在进行系统用户管理时,希望看到的是能登陆到本地系统所有的用户信息,此时看到的用户数据来自远端(公共管理的用户数据)和本地(业务系统特有的用户数据),如何实现分页?下面结合具体情况说明如何实现。

场景是2个数据库,要求排序,并且查询不是非常频繁,访问量也不会很大,没有用户会一直在那里进行翻页操作,同时对于一个企业来说,用户信息频繁变动也是不切实际的。

对于分页功能来说,分两种情况,一种要求排序,一种不要求排序。非排序分页,可以按照同等步长的方式在2个数据源上进行分页查询,也就是分页的每页记录数,平均来自这2个数据源,每次查询每页的记录数都平均来自这2个数据源,当某个数据源没有符合条件的数据记录时,就需要单独查询另外一个数据源,查询的记录数同时也就需要增加;而另外一种情况可以按照同等比例的分页方式,也就是某个数据源每次分页查询时查询的记录数占该数据源符合条件的所有记录的比例是一定的,因为每次分页查询查多少记录是根据2个数据源中所有符合条件的记录总数计算出来的,这样就保证了当分页查询结束后,2个数据源也就同时查询完毕。

那么非排序分页的弊端在那里,首先不能进行排序,这样数据出来比较乱,用户不会满意,其次对于同等比例或者同等步长这两种方式,需要考虑的因素比较多,如下:

  • 每次分页如何平均2个数据源上的查询记录数
  • 当每页记录数变化时怎么处理
  • 当某个数据源查询完毕,没有符合条件的记录时,如何对另一个数据源增加每次查询的记录数?增加后就会影响到计算起始记录数

所以我们决定选择排序分页方式。就是从2个数据源处将足够多的数据取回来,在应用中按照某个条件进行归并排序,然后进行分页显示,难点在于取多少才算是足够的数据?考虑一种比较极端的情况,就是满足当前页的排好序的记录都来自同一个数据源,那么就要求每次查询时,每个数据源的分页记录数至少是这个值。比如当前每页显示4条记录,那么查询第一页时,需要每个数据源至少查出排好序的记录数4条,也就是总共8条记录数,然后进行归并排序,再显示排好序的4条,另外4条记录将会被丢掉;当查询第二页时,是不是只要查询每个数据源中的第二页数据呢?其实不是这样的,因为虽然每个数据源中的分页数据是已经排好序的,但是你无法确定这2个数据源中第二页数据之间的排序情况,有可能其中一个数据源的第三页数据与另外一个数据源的第五页数据才是临近排序的,所以我们需要取回每个数据源的前两页数据,再进行归并排序,那么当用户直接翻到100页的时候,就需要把每个数据源的前100页所有数据都取出,然后进行排序,而且是每次分页查询都需要重新查询一次上次已经查出的数据。

对于这种方式,我们的改进措施是使用缓存,将每次查询出的记录都保存在缓存中,当然是已经排好序的。当用户第一次翻页时,查询第一页数据,实际是从2个数据源处总共查出4(这个偏移量是可以配置的)页大小的数据(每个数据源2页大小数据),同时应用中排好序后进行缓存,这样这四页数据全部从缓存中加载,速度很快;当翻到第五页的时候,再做一次查询(前四页数据不再重复查询),按照偏移量大小,将取回来的数据与原来前四页数据进行重新排好序,然后再次放入缓存中,这样前8页数据都是从缓存中获取,而且是排好序的。

极端情况是,用户一下子直接查询了第100页的数据,那么按照偏移量设置,每个数据源是查询了200页的数据,总共是400页数据被一下子查询出来,然后进行排序放入缓存,对于这种情况,我们做了预防措施,如果跨度过大,比如这里的100页翻页情况,我们直接不予进行查询。

通过结合缓存,保证了排序分页的实现,同时对每次查询条件不同,缓存的内容不同,所以系统对于相同查询条件的查询结果都做了缓存,速度提升明显。并且当用户数据有更新时,并没有及时更新缓存,我们提供了一个刷新按钮,强制清除缓存,重新查询,因为缓存数据配置的是永不过期策略。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • crick77

    缓存会造成数据不一致的问题。
    分页不允许用户查询到 100 页之后??

推荐标签 标签

  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 265 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 5 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18582 引用 • 69128 回帖 • 1 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 3 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 589 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 692 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • gRpc
    10 引用 • 8 回帖 • 52 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖 • 1 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 655 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 84 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 145 回帖 • 1 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 551 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 512 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 131 关注
  • sts
    2 引用 • 2 回帖 • 147 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 2 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 6 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 3 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 596 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    21 引用 • 22 回帖