Sharding 分页原理分析

news2024/11/24 1:19:22

优质博文:IT-BLOG-CN

如果业务上需要执行如下分页查询,Sharding-JDBC如何执行分页查询的? 官方文档

select * from student_time ORDER BY create_time ASC limit 1000, 5;

Sharding-JDBC分页查询时在每个分表中都查询1005条数据,然后在内存中排序,但问题是分页越大,数据量就越多,就会导致内存溢出。Sharding-JDBC对于合并排序做了很好的优化,但是还是需要传输1005条非常大的数据量,查询也非常耗时。

我们先看看Sharding-JDBC中对分页做的优化:

【1】采用流式处理 + 归并排序: 避免内存的过量占用。由于SQL改写不可避免的占用了额外的带宽,但并不会导致内存暴涨。 与直觉不同,大多数人认为Sharding-JDBC会将1,000,010 * 2记录全部加载至内存,进而占用大量内存而导致内存溢出。 但由于每个结果集的记录是有序的,因此Sharding-JDBC每次仅获取各个分片的当前结果集记录,驻留在内存中的记录仅为当前路由到的分片的结果集的当前游标指向而已。 对于本身即有序的待排序对象,归并排序的时间复杂度仅为O(n),性能损耗很小。

Sharding-JDBC分片查询流程:
1、从各个数据节点获取对应的数据集;
2、将数据集进行组合/归并最后得到一个符合预期的结果集;
3、将正确的数据集返回;

Sharding-JDBC的归并由归并引擎负责,归并引擎提供了三种归并方式:
1、流式归并: 流式归并是指每一次从结果集中获取到的数据都能够通过逐条获取的方式返回正确的单条数据,他与数据库原生的返回结果集的方式最为契合。遍历、排序以及流式分组都属于流失归并的一种。

因为流式归并是从数据库中返回的结果集是逐条返回的,并不需要将所有的数据一次性加载至内存中,因此,在进行结果归并时,沿用数据库返回结果集的方式进行归并,能够极大减少内存的消耗,是归并方式的优先选择。

优点:
节省内存: 流式处理允许在内存中只保留当前处理的数据,而不是将整个结果集加载到内存中。这对于处理大数据集非常有利,因为它避免了内存溢出的问题。
实时性: 流式处理可以在数据还在传输的过程中开始处理,这样可以减少等待时间,提高查询的实时性。

缺点:
长连接占用资源: 每次只获取一条数据会导致数据库连接长时间占用,可能会消耗更多的数据库连接资源,特别是在并发查询较多的情况下。
性能开销: 每次获取一条数据需要多次网络往返,这可能会增加网络开销和延迟,特别是在高延迟网络环境中。

2、内存归并: 内存归并则是需要将结果集的所有数据都遍历并存储在内存中,再通过统一的分组、排序以及聚合等计算之后,再将其封装成为逐条访问的数据结果集返回。
3、装饰者归并: 装饰者归并是对所有的结果集归并进行统一的功能增强,目前装饰者归并有分页归并和聚合归并这2种类型。

流失归并的原理

ShardingJDBC的流式处理和JDBCResultSet的原理是一样的,主要是通过和数据库保持长连接,每次next都只取当前游标所在位置的一条数据,然后在内存中进行归并。

具体流程如下: 假设user表分为db0: user_0,db1: user_1, db2: user_2三张表

1、当进行分页查询时,会将查询语句下发到三个数据源分别进行获取:

2、数据源执行了sql后,并不会将查询到的数据集直接返回给客户端,而是先将结果集存储在数据源本地,等待client通过游标一条条读取。每一个表都会维护一个自己表的游标,初始位置为第一条记录。

3、每一轮都只传输游标当前指向的记录,client会将接收到的记录加入优先级队列,第一轮的时候client维护的优先级队列如下所示。优先级队列是按照sql要求的排序字段排序。

在这里插入图片描述

4、优先级队列队首出队到优先级队列PriorityQueue,会执行next,去对应的db中取下一条记录,此时数据源维护的游标要向下移动一格。上述例子中,便会去user_1中取出下一条记录,再重新入队进行排序,第二轮的结果如下图所示。

出队的数据存在哪里?
内存缓冲区: 当查询结果从各个分片返回时,Sharding-JDBC会将这些结果暂时存储在内存缓冲区中。在调用next()方法时,从缓冲区中获取下一条记录并返回给调用者。这种方式确保了数据在内存中是可用的,直到被处理完毕。
合并和排序: 在分页查询过程中,·Sharding-JDBC会将来自不同分片的结果集进行合并和排序。合并和排序后的结果集也会暂时存储在内存中,以便在调用next()方法时能够顺序返回正确的记录。 **游标位置:** 游标会记录当前的位置,以便在调用next()时能够正确返回下一条记录。这种机制确保了分页查询的顺序性和一致性。 **临时存储:** 在某些情况下,如果查询结果集非常大,内存不足以存储所有数据,Sharding-JDBC`可能会使用临时文件或其他形式的临时存储来保存部分结果集。这样可以避免内存溢出问题,但会牺牲一些性能。

Sharding-JDBC的分页查询过程中,数据通常会暂时存储在内存缓冲区中,直到被处理完毕。如果内存不足,可能会使用临时存储来保存部分数据。游标记录当前的位置,以确保能够顺序返回正确的记录。

5、优先级队列操作next的同时,内部维护了一个rowNumber,用来表示当前记录是第几个,每次取next时,都会+1,源码部分如下:

public boolean next() throws SQLException {
  if (this.skipAll) {
    return false;
  } else if (this.limit.getRowCountValue < 0) {
    return this.getMergerdResult().next();
  } else {
    return ++this.rowNumber <= this.limit.getRowCountValue() && this.getMergedResult().next();
  }
}

limit分页的时候,便是通过这个字段找到对应开始的记录,开始拼接有效的结果集。

【2】Sharding-JDBC对仅落至单分片的查询进行进一步优化。 落至单分片查询的请求并不需要改写SQL也可以保证记录的正确性,因此在此种情况下,Sharding-JDBC并未进行SQL改写,从而达到节省带宽的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2195796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【树结构与栈】中等力扣练习题

二叉树中和为目标值的路径 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5…

2024.10月7日- 非关系型数据库--- Redis

一、Redis介绍 Redis(Remote Dictionary Server)&#xff0c;即远程字典服务,也被人们称之为***结构化数据库*** 功能&#xff1a;把周期性数据持久化还能实现主从复制 是一个开源的用C语言编写的支持网络、基于内存、可持久化的日志型Key-Value数据库提供多种语言的API Re…

Facebook 正式推出了一项专为 Z 世代设计的全新改版

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于Springboot海宝海鲜餐厅系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

图文深入理解Oracle DB Scheduler(续)-调度的创建

List item 今天是国庆假期最后一天。窗外&#xff0c;秋雨淅淅沥沥淅淅下个不停。继续深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。 本篇承接前一篇&#xff0c;继续图文深入介绍Oracle DB Scheduler。本篇主要介绍调度的创建。 1. 创建基于时间的作业 • 可以…

详解三种常用标准化:Batch Norm Layer Norm RMSNorm

Normalization Normalization现在已经成了神经网络中不可缺少的一个重要模块了&#xff0c;并且存在多种不同版本的归一化方法&#xff0c;其本质都是减去均值除以方差&#xff0c;进行线性映射后&#xff0c;使得数据满足某个稳定分布&#xff0c;如下图所示&#xff1a;  …

开放式耳机是什么意思?分享几款适合各类运动佩戴的蓝牙耳机

其实目前有很多热爱运动的人士常常会陷入一个纠结之中&#xff0c;那就是在进行爬山、骑行、步行、跑步或者健身等各类运动的时候&#xff0c;到底佩戴什么样的蓝牙耳机才最为合适呢&#xff1f;那就我个人而言&#xff0c;我觉得开放式耳机无疑会是运动人士的救星。因为作为一…

OJ在线评测系统 微服务高级 网关跨域权限校验 集中解决跨域问题 拓展 JWT校验和实现接口限流降级

微服务网关跨域权限校验 集中的去解决一下跨域 这段代码是用来配置跨源资源共享&#xff08;CORS&#xff09;过滤器的。它创建了一个 CorsConfiguration 实例&#xff0c;允许所有方法和头部&#xff0c;并支持凭证&#xff08;如 Cookies&#xff09;。setAllowedOriginPat…

基于SSM+小程序的教育培训管理系统(教育3)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 基于SSM小程序的教育培训管理系统&#xff08;教育3&#xff09; 1、项目介绍 1、管理员权限操作的功能包括增删改查网课信息&#xff0c;教师信息&#xff0c;学生信息&#xff0c;试卷&#xff0c;…

多元化网络团队应对复杂威胁

GenAI、ML 和 IoT 等技术为威胁者提供了新的工具&#xff0c;使他们更容易针对消费者和组织发起攻击。 从诱骗受害者陷入投资骗局的Savvy Seahorse &#xff0c;到使用 ChatGPT 之类的程序感染计算机并阅读电子邮件的自我复制 AI 蠕虫&#xff0c;新的网络威胁几乎每天都在出现…

【机器学习】探索机器学习在医疗影像分析中的应用

1. &#x1f680; 引言1.1 &#x1f680; 医疗影像分析的现状与发展趋势1.2 &#x1f4dc; 机器学习在医疗影像分析中的核心概念1.3 &#x1f3c6; 医疗影像分析在临床应用中的作用 2. &#x1f50d; 医疗影像分析的演变与创新2.1 &#x1f31f; 医疗影像分析的发展历程2.2 &am…

SQl注入文件上传及sqli-labs第七关less-7

Sql注入文件上传 1、sql知识基础 secure_file_priv 参数 secure_file_priv 为 NULL 时&#xff0c;表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时&#xff0c;表示限制mysqld只能在/tmp目录中执行导入导出&#xff0c;其他目录不能导出导入。 secure_fil…

linux信号 | 信号的补充知识

前言&#xff1a;本节内容主要是一些linux信号的周边知识或者补充知识。 对于信号的学习&#xff0c; 学习了信号概念&#xff0c; 产生&#xff0c; 保存与捕捉就已经算是认识我们的信号了。 如果想要知道更多关于信号的知识也可以看一下本篇文章。 ps&#xff1a;本篇内容适…

CSS——文字渐入效果

CSS——文字渐入效果 昨天制作了文字的打字机效果&#xff08;CSS——文字打字机效果&#xff09;&#xff0c;然后我想到有些网页的文字效果是平滑渐入的&#xff0c;我就去思考这样的实现方式&#xff0c;其实就把之前的steps()函数去掉即可&#xff0c;但是我想换种实现方式…

电脑无法无线投屏的解决办法

在前司的时候经常遇到电脑无法使用无线投屏器的情况&#xff0c;今天就来聊聊如何解决。 1.不会连接。这种情况&#xff0c;经常发生在WIN10升级WIN11之后&#xff0c;一般是两种办法&#xff0c;一种是同时按键盘上的WINDOWS和K键&#xff0c;右下角就会出来连接的图标&#…

Day8:返回倒数第k个节点

题目&#xff1a; 实现一种算法&#xff0c;找出单向链表中倒数第k个节点。返回该结点的值。 示例&#xff1a; 输入&#xff1a;1->2->3->4->5和k2 输出&#xff1a;4 说明&#xff1a; 给定的k保证是有效的。 public int kthToLast(ListNode head,int k){…

《动手学深度学习》Pytorch 版学习笔记一:从预备知识到现代卷积神经网络

前言 笔者有一定的机器学习和深度学习理论基础&#xff0c;对 Pytorch 的实战还不够熟悉&#xff0c;打算入职前专项突击一下 本文内容为笔者学习《动手学深度学习》一书的学习笔记 主要记录了代码的实现和实现过程遇到的问题&#xff0c;不完全包括其理论知识 引用&#x…

GRASP七大基本原则+纯虚构防变异

问题引出 软件开发过程中&#xff0c;需要设计大量的类&#xff0c;使他们交互以实现特定的功能性需求。但是不同的设计方式&#xff0c;对程序的非功能性需求&#xff08;可扩展性&#xff0c;稳定性&#xff0c;可维护性等&#xff09;的实现程度则完全不同。 有没有一种统一…

动态规划算法——三步问题

1.题目解析 2.算法原理 本题可以近似看做泰波那契数列&#xff0c;即小孩到第一个台阶需要一步&#xff0c;到第二个台阶则是到第一个台阶的步数加上第一阶到第二阶的步数&#xff0c;同理第三阶就是第二阶的步数加上第二阶到第三阶的步数&#xff0c;由于小孩只能走三步&#…

基于STM32的智能垃圾桶控制系统设计

引言 本项目设计了一个基于STM32微控制器的智能垃圾桶控制系统&#xff0c;能够通过超声波传感器检测手部动作&#xff0c;自动打开或关闭垃圾桶盖&#xff0c;提升用户的便利性和卫生性。该项目展示了STM32微控制器在传感器检测、伺服电机控制和嵌入式智能控制中的应用。 环…