Sharding 分页原理分析

优质博文: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.rhkb.cn/news/440976.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Canvas与标牌】盾形银底红带Best Quality Premium标牌

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>BestQulityPremium金属牌重制版Draft2</title><style type&…

笔记本电脑重启输入密码后黑屏

型号&#xff1a;Dell G3 3590 系统&#xff1a;Win10 背景 原本想安装火绒清一清缓存之类的垃圾文件的&#xff0c;安装完火绒之后点击垃圾清理&#xff0c;提示需要更新工具&#xff0c;ok,更新&#xff0c;进度到50%就不动了&#xff0c;然后火绒通知我 发现危险信息&…

基于双PI控制器和SVPWM的定转子双永磁同步电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 永磁同步电机的基本结构和工作原理 4.2 双PI控制器的设计方法 4.3 SVPWM 的实现原理 5.完整工程文件 1.课题概述 为了实现定转子双永磁同步电机的高性能控制&#xff0c;通常采用双 PI 控制器和 S…

OpenHarmony中OpenSSL从1.1.1 升级到3.0.7 时不支持MD4算法导致wpa_supplicant报错问题解决

OpenHarmony中OpenSSL从1.1.1 升级到3.0.7 时不支持MD4算法导致wpa_supplicant报错问题解决 1 问题现象 我们在测试EAP-PEAP(MSCHAPV2)功能时发现如下打印,导致认证失败 2 初步分析 openssl_digest_vector 中 调用EVP_DigestInit_ex 时如果报错 会打印"OpenSSL: EVP…

【鸿蒙学习】深入解析鸿蒙应用与元服务:含义、区别、应用场景及创建方法

文章目录 鸿蒙应用&#xff08;HarmonyOS App&#xff09;含义用于干什么优缺点 元服务&#xff08;Atomic Service&#xff09;含义用于干什么优缺点 鸿蒙应用与元服务的区别创建方法鸿蒙应用的创建元服务的创建 总结 随着科技的不断进步&#xff0c;操作系统也在不断迭代更新…

自用Proteus(8.15)常用元器件图示和功能介绍(持续更新...)

文章目录 一、 前言二、新建工程&#xff08;以51单片机流水灯为例&#xff09;2.1 打开软件2.2 建立新工程2.3 创建原理图2.4 不创建PCB布版设计2.5 创建成功2.6 添加元器件2.7 原理图放置完成2.8 编写程序&#xff0c;进行仿真2.9 仿真 三、常用元器件图示和功能介绍3.1 元件…

平安养老险深圳分公司积极开展“金融教育宣传月”活动,展现金融为民新风尚

2024年9月&#xff0c;平安养老险深圳分公司以“金融为民谱新篇&#xff0c;守护权益防风险”为主题&#xff0c;正式启动2024年“金融教育宣传月”活动&#xff0c;通过多样化开展进乡村、进商圈、进企业等宣传教育活动&#xff0c;将金融消保知识送达广大消费者身边&#xff…

【目标检测】常见机械零件数据集5900张5类VOC+YOLO

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5913 标注数量(xml文件个数)&#xff1a;5913 标注数量(txt文件个数)&#xff1a;5913 标注…

Conda答疑

文章目录 优雅的使用Conda管理python环境1. conda info -e 和conda env list区别2.conda创建环境 创建的新环境在哪个文件夹下3. 自定义路径4. anaconda 新建环境 包是来自哪里4.1. 默认 Anaconda 仓库4.2. Conda-Forge4.3. 镜像源4.4. 自定义频道4.5. 总结 5. conda config --…

详解单流Transformer架构中图像/文本/表格/视频/音频经过transformer提取模态特征并生成令牌特征以及CLS到底是什么作用?

系列论文研读目录 文章目录 系列论文研读目录论文中经常出现的如下图中所示结果&#xff0c;其中到底做了什么&#xff1f;1、一张图片 经过self attention 和Feed forward 生成的是什么&#xff1f;具体流程如下&#xff1a;结果&#xff1a; 举个具体计算的例子假设条件1. 自…

番外篇 | CRAS-YOLO:基于卫星图像的多类别船舶检测和分类

前言:Hello大家好,我是小哥谈。目前,基于卫星图像的多类别船舶检测和分类由于在军事和民用领域的重要应用而备受关注。针对传统检测效果不佳的情形,我们进一步提出了一种新的多类船检测,称为CRAS-YOLO,它由卷积块注意力模块(CBAM)、感受野块(RFB)和基于YOLOv5s的自适…

python调用父类同名成员

语法 print(f"父类的厂商是&#xff1a;{Phone.producer}“) Phone.call_by_5g(self) print(f"父类的厂商是&#xff1a;{super().producer}”) print(f"父类的序列号是&#xff1a;{super().IMEI}") super().call_by_5g() print(“关闭CPU单核模式&…

产品经理内容分享(二):AI产品经理的入门路线图

引言 想象这样一个场景&#xff1a;早晨的阳光穿透窗帘&#xff0c;投射在新一代智能机器人上&#xff0c;它正静静等待着你的第一个命令开始全新的一天。这样的场景听起来像是科幻小说里的情节&#xff0c;但实际上&#xff0c;这正是AI产品经理们工作的成果。如果你对这样的…

超好用的element的el-pagination分页组件二次封装-附源码及讲解

前言&#xff1a;在很多后台管理系统开发时总会有很多分页组件的使用&#xff0c;如果我们每次都用elementui官网的el-pagination去写的话&#xff0c;调整所有分页的样式就会很麻烦&#xff0c;而且页面内容也会很累赘繁琐。 讲解一个我经常使用的二次封装el-pagination组件&…

c语言中,数组指针、指针数组、函数指针、指针函数

数组指针 直接理解为指向数组的指针&#xff0c;一般用于二位数组引用程序&#xff0c;形式如下 下面程序中用在二维数组中&#xff0c;把这个数组指针看作二维数组的第一维的指向&#xff1a; 用在一维数组中&#xff08;本质还是二维数组&#xff09;如下&#xff0c;类似…

JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)

目录 Dialog对话框 介绍 使用 实际效果 Form表单 介绍 使用 实际效果 Dialog对话框 介绍 Dialog对话框&#xff1a;在保留当前页面状态的情况下&#xff0c;告知用户并承载相关操作。 Dialog 对话框组件可以在保留当前页面信息的状态下弹出一个对话框&#xff0c;并…

C语言 | 第十一章 | static 日期函数 数学函数

P 100 变量作用域基本规则 2023/1/9 一、基本介绍 概念&#xff1a;所谓变量作用域&#xff08;Scope&#xff09;&#xff0c;就是指变量的有效范围。 函数内部声明/定义的局部变量&#xff0c;作用域仅限于函数内部。 #include<stdio.h> void sayHello() {char nam…

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言&#xff0c;广泛应用于多个领域。Java的编程思想&#xff0c;包括面向过程和面向对象编程&#xff0c;Java的发展历史&#xff0c;各版本的特点&#xff0c;JVM原理&#xff0c;数据类型&#xff0c;Java SE与Java EE的区别&#xff0c;应用场景&…

运用MinIO技术服务器实现文件上传——利用程序上传图片(二 )

在上一篇文章中&#xff0c;我们已经在云服务器中安装并开启了minio服务&#xff0c;本章我们将为大家讲解如何利用程序将文件上传到minio桶中 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 - **对象&#xff08;Object&#xff0…

六、索引的数据结构

文章目录 1. 为什么使用索引2. 索引及其优缺点2.1 索引概述2.2 优点2.3 缺点3. InnoDB中索引的推演3.1 索引之前的查找3.1.1 在一个页中的查找3.1.2 在很多页中查找3.2 设计索引3.2.1 一个简单的索引设计方案3.2.2 InnoDB中的索引方案3.3 常见索引概念3.3.1 聚簇索引3.3.2 二级…