ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析

这篇具有很好参考价值的文章主要介绍了ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 分库分表下的分页查询

业务数据达到一定数据量时,必定会引入数据库分片,但当对于分片的情况下,分页查询是如何做到的?

比如: 数据库db1,中有三个user表,user_0,user_1,user_2,三个表的分片策略是以userId 与 3 取余。分片配置入下

# 指定user表的数据分布情况
spring.shardingsphere.sharding.tables.user.actual-data-nodes = db1.user_$->{0..2}

# 指定user表的分片策略,分片策略包括分片键和分片算法
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column = id
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression = user_$->{id % 3}

现在执行分页查询语句

select * from `user` order by id limit 10000,10;

考虑到三个表的分片策略,如果要正确获取到 10000-100010 区间的数据的话,需要将三个表都查询出100010 条数据,再做归并排序,最后才能得到正确的结果集。

这样便产生了最让人担忧的问题,如果没张表都要查询那么多数据在我内存中排序,如果我有上百张表,那内存迟早溢出,产生OOM?

2. ShardingJDBC 的优化

官方文档在这里:shardingsphere

ShardingSphere 对分片查询的优化是通过使用 流式归并+优先级队列 实现的,可以减少对本地内存的占用(只有每个数据源的游标而已),但是并不能减少带宽资源的消耗。

ShardingJDBC 对这种分片查询的处理方式为:

  1. 从各个数据节点获取对应的数据集。
  2. 将上述获取的数据集,进行组合、归并, 最后得到一个符合预期的数据集。
  3. 将正确的数据集返回。

上述三个步骤中最重要的就是 归并的策略…

ShardingJDBC 的归并由归并引擎负责,归并引擎提供了三种归并方式
流式归并、内存归并和装饰者归并

  • 流式归并是指每一次从结果集中获取到的数据,都能够通过逐条获取的方式返回正确的单条数据,它与数据库原生的返回结果集的方式最为契合。遍历、排序以及流式分组都属于流式归并的一种。

  • 内存归并则是需要将结果集的所有数据都遍历并存储在内存中,再通过统一的分组、排序以及聚合等计算之后,再将其封装成为逐条访问的数据结果集返回。

  • 装饰者归并是对所有的结果集归并进行统一的功能增强,目前装饰者归并有分页归并和聚合归并这2种类型。

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

3. 流式归并的原理

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

具体流程如下:

假设user表分为 db0: user_0, db1: user_1, db2: user_2 三张表
查询语句为:
select * from user order by id limit 10,10;

  1. 因不确定数据分布关系,所以,下发到三个表的sql指令都为 select * from user_$ order by id limit 0,20;

ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析

  1. 数据源执行了sql后,并不会将查询到的数据集直接返回给客户端,而是先将结果集存储在数据源本地,等待client通过游标一条条读取。每一个表都会维护一个自己表的游标,初始位置为第一条记录。
    ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析

  2. 每一轮都只传输游标当前指向的记录,client会将接收到的记录加入优先级队列,第一轮的时候client 维护的优先级队列如下所示。优先级队列是按照sql要求的排序字段排序。
    ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析

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

ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析文章来源地址https://www.toymoban.com/news/detail-432048.html

  1. 优先级队列操作next的同时,内部维护了一个 rowNumber,用来表示当前记录是第几个,每次取next时,都会 +1 ,源码部分如下:
    ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析
    limit分页的时候,便是通过这个字段找到对应开始的记录,开始拼接有效的结果集。

到了这里,关于ShardingJDBC 数据库分片 流式处理+归并排序 优化原理刨析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GoldenDB-02数据库安装及分片介绍、重分布

    omm_domain_name配置本地ip 4.pm cm mds连接信息 开始时是线下操作,追平数据会短暂影响写入业务 线下阶段与线上阶段

    2024年02月12日
    浏览(31)
  • 详解数据库分片,大幅提升Spring Boot查询MySQL性能

    微服务项目中通常包含各种服务。其中一项服务与存储用户相关的数据有关。我们使用Spring Boot作为后端,使用MySQL数据库。 随着用户基数的增长,服务性能受到了影响,延迟也上升了。由于只有一个数据库和一张表,许多查询和更新由于锁异常返回错误。此外,随着数据库

    2024年01月16日
    浏览(33)
  • ElasticSearch数据库修改分片数、副本数及修改mapping字段

            对于已经存在的索引,副本数可以随时修改。 示例演示如下:         ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。分片数量的设

    2024年02月02日
    浏览(41)
  • Sharding-JDBC 自定义一致性哈希算法 + 虚拟节点 实现数据库分片策略

    分片操作是分片键 + 分片算法,也就是分片策略。目前Sharding-JDBC 支持多种分片策略: 标准分片策略 对应StandardShardingStrategy。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。 复合分片策略 对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作

    2024年02月02日
    浏览(43)
  • 数据库的事务处理

    在现代信息化时代,大量的数据不断地被创建、修改、删除和查询。 为了保证数据的准确性和一致性,数据库的事务处理成为了必不可少的一个重要组成部分。 本文将针对数据库的事务处理进行详细阐述,包括事务的概念、特性、ACID属性、隔离级别以及事务的并发控制等方

    2024年02月06日
    浏览(49)
  • Spring数据库事务处理

    事务回滚丢失更新: 目前大部分数据库已经通过锁的机制来避免了事务回滚丢失更新。 数据库锁的机制: 锁可以分为乐观锁和悲观锁,而悲观锁又分为:读锁(共享锁)和写锁(排它锁),而数据库实现了悲观锁中的读锁和写锁,而乐观锁则需要开发人员自己实现。 数据库在设

    2024年02月07日
    浏览(37)
  • 【Jetpack】使用 Room 中的 Migration 升级数据库异常处理 ( 多个数据库版本的迁移 | fallbackToDestructiveMigration() 函数处理升级异常 )

    Room Migration 数据库迁移工具 是 Android Jetpack Architecture Components ( 架构组件 ) 的一部分 , 它是一个方便的 数据库迁移工具 , 用于为 Android 中使用 Room 框架创建的数据库 提供 自动化迁移方案 ; Room Migration 数据库迁移工具用途如下 : 数据库修改 : 修改数据库表结构 ; 迁移代码 : 为

    2024年02月08日
    浏览(34)
  • Elasticsearch的图数据库&图数据处理

    Elasticsearch是一个开源的搜索和分析引擎,它基于Lucene库构建,具有高性能、可扩展性和实时性。Elasticsearch的核心功能包括文本搜索、数据聚合、实时分析等。 图数据库是一种特殊类型的数据库,它用于存储和管理网络结构的数据。图数据库使用图形结构来表示数据,其中数

    2024年02月21日
    浏览(36)
  • 【数据处理】建立数据库索引并定时重建索引

    给表 建立索引能加速查询 (我的习惯是给经常查询的列建立索引,如果经常查询的是id列,我会给将id设置为主键),长时间查询后会变慢(具体原因目前不清楚),公司前辈说 定期重建索引就可以解决问题 ,我就在 Microsoft Sql Server Management Studio 里设置了定时“自动重建索

    2024年01月25日
    浏览(37)
  • 利用java.sql包--访问和处理数据库数据

    The java.sql package in Java provides the API for interacting with relational databases using JDBC (Java Database Connectivity). JDBC is a standard Java API that allows Java programs to connect to and interact with various database management systems (DBMS) using SQL (Structured Query Language). The java.sql package contains several important interfaces and

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包