分布式 - 跨库分页

 select * from T order by time offset X limit Y 的跨M个库分页。

全局

每个库都必须返回 X+Y 个数据,所得到的 M*(X+Y) 在服务层进行内存排序,然后再取总的偏移量X后的Y条记录。

  • 优点: 精准返回所需数据。
  • 缺点: (1)每个分库需要返回更多的数据,占用网络带宽;(2)需要服务层的计算;(3)这个算法随着页码的增大(即X的增大),性能平方级下降。

禁止跳页查询(业务折衷)

获取第一页的方式和全局策略是一样的,但获取第N页(N>1)时,我们取 N-1 页的最大time,即time_max, 对于每个分库执行 select * from T order by time where time > time_max limit Y,这样在服务层再总排序取前Y条记录。

  • 优点: 相比全局策略的性能平方级下降,该策略的性能是恒定的。
  • 缺点: 禁止跳页查询。

[推荐] 二次查询

数学原理:对于一个有序序列分成 M 个长度不等的有序子序列,M个有序子序列中每个有序子序列前X个元素中的最大值集中起来,再取其中最小值,则该最小值一定小于等于原来有序序列的第 M*X 个元素值。
假设该最小值大于原序列的第 MX 个元素值,那么M个有序子序列后面第X+个元素值都大于原序列的第 MX 个元素值,即构成原序列前MX 个元素只能是M个有序子序列的前X-个元素,因为MX- < M*X,所以假设不成立。

步骤:

  1. 改写分库sql为: select * from T order by time offset ceil(X/M) limit Y
  2. 获取所有分库sql中返回的最小time中的最小time,即time_min(详见上面原理)
  3. 改写分库sql为:select * from T order by time between time_min and 各自分库的最大time(从第1步中得到)
  4. 第3步的各个分库的返回结果比第一步多,当然time_min的那个分库的返回结果肯定不变(所以time_min的那个分库的sql在实现时可以不用执行)。假设所有分库总共多出 K 条数据,则全局_offset = ceil(X/M) * M - K 。(详见上面原理)
  5. 将第3步返回的结果集合并,即第一条数据就是time_min的那条,其_offset由第四步已经得到;我们直接在该结果集的中从第(原始sql的offset - _offset + 2)条数据开始获取Y条数据。
  • 优点: 该策略的性能是几乎恒定。
  • 缺点: 两次查询;内存中要将结果集合并。

rust-zero

68 声望
4 粉丝
0 条评论
推荐阅读
高并发 - AbstractQueuedSynchronizer
AbstractQueuedSynchronizer队列是CLH队列的变种,CLH队列等待采用自旋,AQS的队列等待采用LockSupport#park。

重构地球阅读 1.7k

万字长文~vue+express+mysql带你彻底搞懂项目中的权限控制(附所有源码)
所谓的权限,其实指的就是:用户是否能看到,以及是否允许其对数据进行增删改查的操作,因为现在开发项目的主流方式是前后端分离,所以整个项目的权限是后端权限控制搭配前端权限控制共同实现的

水冗水孚8阅读 1.2k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go10阅读 1.9k评论 2

封面图
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide5阅读 789

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬8阅读 1.1k

与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。

lpe2348阅读 1.9k

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2.3k评论 2

封面图

rust-zero

68 声望
4 粉丝
宣传栏