分布式环境中的多机分库分表的数据查询

2024-06-05 18:08

本文主要是介绍分布式环境中的多机分库分表的数据查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

跨库连接查询join

如果需要join的数据存在于多个库中,那就比较麻烦,解决的思路有如下几种:

  • 在应用层把原来数据库的Join操作分成多次的数据库操作。在应用层层面上去对数据库进行操作
  • 数据冗余,也就是对一些常用的数据进行冗余,这样可以把原来需要Join的数据变为单表查询。这需要结合具体的业务场景
  • 借助外部系统解决一些跨库问题

外键约束

外键约束的问题比较难解决,不能完全依赖数据库本身来完成之前的功能了。如果要对分库后的单库做外键约束,就要求分库后的每个单库的数据是内聚的。否则就要靠应用层的判断,容错等方式了。

跨库查询的问题及解决

数据库分库分表的演化

这里写图片描述
从逻辑上来说,用户信息应该放在一起存储,然而随着数据量,访问量的增加,需要经历分库分表,此时用户信息在物理上是分布在多个数据库的多张表的。也就是如上图所示的一张逻辑上的表对应了多张物理上的表,对这张表的查询就要做跨库跨表的合并了。这个场景和上面讲的跨库Join还不同,跨库join是在不同的逻辑表之间的Join,在分库后这些Join可能需要跨越多个数据库,而我们现在看到的是针对一个逻辑表的查询操作,但因为物理上分到了多个库多个表,因而产生了数据的合并查询

从具体例子看分库分表后查询的问题。

例子:
当我们假设我们将用户信息按照省份来划分时,如果我们去查询多个省的用户信息,那么就需要跨库查询了。在这样的情况下就需要对查询结果在应用上进行合并,这相对比较简单,但是在一些场景下需要进行较为复杂的操作,介绍如下:

  • 排序,即多个来源的数据查询出来后,在应用层进行排序的工作,如果从数据库中查询出来的数据已经是排好序的,那么在应用层就是要对多路数据的归并排序,如果查询出来的数据未排序。就要进行一个全排序。
  • 函数处理,即使用Max,Min,Sum,Count等对多个数据来源的值进行相应的函数处理
  • 求平均值,从多个数据源进行查询时,需要把SQL改为查询Sum和Count,然后对多个数据来源的Sum进行求和,Count求和之后计算平均值。
  • 非排序分页,分为同步等长分页,还是同等比例分页。
  • 排序后分页。这是比较复杂的情况,因为每一个数据源中排序后的大小不能预估,所以我们需要在取数据的时候进行多次比较,性能会收到很大影响。因此,在访问量很大的系统中,我们应该尽量避免这种方式。

参考 大型网站系统与Java中间件实践

这篇关于分布式环境中的多机分库分表的数据查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033790

相关文章

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Centos环境下Tomcat虚拟主机配置详细教程

《Centos环境下Tomcat虚拟主机配置详细教程》这篇文章主要讲的是在CentOS系统上,如何一步步配置Tomcat的虚拟主机,内容很简单,从目录准备到配置文件修改,再到重启和测试,手把手带你搞定... 目录1. 准备虚拟主机的目录和内容创建目录添加测试文件2. 修改 Tomcat 的 server.X

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

VSCode配置Anaconda Python环境的实现

《VSCode配置AnacondaPython环境的实现》VisualStudioCode中可以使用Anaconda环境进行Python开发,本文主要介绍了VSCode配置AnacondaPytho... 目录前言一、安装 Visual Studio Code 和 Anaconda二、创建或激活 conda

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1