MyCat-架构剖析-核心技术之跨库 join 实现 | 学习笔记

简介: 快速学习 MyCat-架构剖析-核心技术之跨库 join 实现

开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(三):MyCat-架构剖析-核心技术之跨库 join 实现】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/757/detail/13303


MyCat-架构剖析-核心技术之跨库 join 实现

内容介绍

一、跨库的连接查询

二、全局表

三、 ER 表

四、catlet

 

一、跨库的连接查询

MyCat 如何完成跨库的连接查询,关于跨库的连接查询给大家举一个例子。

当我们写一条 SQL 语句,写 select*from tb_order o ,给它起个别名。然后还有一张表—— tb_city  ,我们叫它 C ,这两张表它们要通过外耳条件来消除笛卡尔积,就是 o.cityid=c.id。

这个 SQL 语句的作用是什么呢?它要查询什么信息呢?

o 代表的是 order 订单表, C 代表的是 city 表,城市表。在订单表当中有一个外界 cityid , ctyid 指的是城市的 id 。我们得知道订单是哪个省份哪个城市下的,此时,我们就可以通过 cityid=c.id 来销售笛卡尔积,然后后面再加上一个条件—— and o.id=某个数值。根据订单的 ID 查询订单及其对应的城市信息,现在是一个很简单的多表查询,涉及到两张表。一张表是 order 表,另外一张表是 city 表。跨库的join操作实际上指的是在进行分库分表的时候,两张表可能会分到两个数据库当中,这个时候就会存在跨库的 join 问题。如何解决这个问题呢?

 

二、全局表

第一种解决方案,通过全局表,这个指的是在很多的业务系统当中会存在一些基础信息表。

哪些是属于基础信息表呢?

比如,数据字典表、省份表、城市表,这就是上面提到的 city ;区域表、语言表,这些都是基础信息表。这些表当中的数据量并不大,并且这些表和业务表之间存在关系,但不是业务的主从关系,而是一种属性关系。

这时我们可以将这些表当中的数据作为全局表存在,作为全局表存在指的是在 MySQL 的各个节点当中都会有这些表,都会有这些数据。如果在 MySQL 的各个节点当中都会有这些数据,那么这个时候也就相当于不会跨库的 join 操作,本地当前这个数据库节点就可以实现查询。

image.png

全局表的特点

第一个特点:全局表的 insert、update、delete 操作会实时的插入到所有节点,在所有节点当中同步执行,保持各个节点数据的一致性。

第二个特点:全局表的查询操作会从任意节点执行,因为所有节点数据都一致。

第三个特点:全局表可以和任意表进行 join 操作。因为不管另外一张表在哪个数据库当中, city 表三个数据库当中都有。此时就不会存在跨库的 join 操作。

这就是第一种解决方案通过全局表实现。

image.png

全局表之前也用过,只不过是在 table 当中,加上一个属性 global ,就声明为全局表。这是跨库 join 的第一种解决方案,通过全局表实现。

 

三、ER 表

image.png

第二种解决方案,通过 ER 表。

关系型数据库当中是基于实体关系模型的, MyCat 中的 ER 表便是来源于此。当我们插入数据的时候,子表的记录与其关联的父表的记录会在同一个分片当中。大家现在对于我们订单这一块的表结构来说,可能会有这么两张表,一个叫做 order ,一个叫做 order_ item ;order 表是订单表, order _item 表是订单明细表。

在插入订单以及订单明细的时候,操作的是 MyCat , MyCat 会根据我们所配置的分线规则将某条数据插入到其中的一个节点。假如,插入到第一个节点,插入的时候怎么插入呢?既插入订单,又插入明细。如果我们将订单插入到第一个节点,明细插入到第二个节点,那么接下来我们去查询的时候,就会存在跨库的 join 操作。如何解决这个问题呢?

当我们插入订单的时候,假如我们插入了一个订单,订单的 ID 是1000,那么接下来,当我们再去插入 1000 这个订单所关联的明细的时候,这个时候怎么办呢?

我们把 1000 这个订单所关联的明细,我们也插入到同一个节点当中,那么这个时候就相当于 1000 这个订单和 1000 这个订单所关联的明细都在同一个节点当中,此时也就解决了跨库的 join 操作。因为是同一个数据,这就是第二个解决方案,基于 ER 表来完成跨库的  join 操作。

 

四、catlet

第三种方案,通过 catlet 实现跨库 join 。

catlet  是 MyCat 为了解决跨库的分线 join 提出的一种创新思路,它也叫HBT人工智能。

这个主要是借鉴了数据库当中的存储过程来完成的。如果我们要使用 catlet 这种方式,那么用户需要根据系统提供的 API 接口手动的实现 join ,也就是说 MyCat 当中给我们提供了一个接口,我们可以通过自定义这个接口的实现类来完成跨库的 join 操作,这个接口就是 catlet 接口。

我们直接搜一个 catlet 就这个接口。

image.png

在这个接口当中有两个方法,一个是 process SQL ,一个是 route 。

process SQL 这个方法,是用来执行 SQL 语句,并给客户端返回结果集,这个就是用来执行 SQL 语句。 Route 这个方法,是路由的方法,就是用来传递我们系统的配置等相关信息。这里可以拿到系统的配置,可以拿到 schema 当中的配置,可以拿到 catlet 的类型,也可以拿到真实的 SQL 语句,以及字符集,还有对应的连接信息。

在 route 方法当中,我们就可以实现别人的路由操作。这是 MyCat 当中给我们提供的一个接口,我们可以根据这个接口去定义它的实现类。实现类定义好之后,我们可以将这个实现类进行一个编译,并且将它存放在 MyCat 安装目录下,有一个目录就叫 catlet 。

MyCat 的安装目录下就会有一个目录,叫做 catlet 。

catlet 这个目录将我们编写好的 class 的字节码文件存放在 catlet 这个目录下。当我们隔了一分钟之后,这个文件就会被扫到并且更新,然后进行一个下载,这个过程我们不需要重启 MyCat 的图,当然你也可以选择重启。

所以,用 catlet 这种形式实现跨库的 join ,第一步:先定义这个类对应的实现类,第二步:将这个实现类进行编译,将编译后的字节码文件存放在 MyCat 安装目录下的 catlet 。

catlet 是一个接口,如果我们不想使用这种方式,那么我们可以选择使用全局表以及 ER 表。如果要使用这种方式 ,MyCat 当中有没有提供对应的实现呢?

image.png

这个里面有一个实现,叫做 Share join ,它是一种什么样的分片方式呢?或者说什么样的 join 方式?

Share join 是 catlet 的实现,也就是 catlet 这个接口的实现类。它可以做一个简单的分片 join ,目前仅支持两张表的 join 。 share join 的核心是解析 SQL 语句,在 route 里面做一系列的操作解析SQL 语句。

解析完 SQL 语句会将 SQL 语句拆分成单表进行查询,然后把在各个节点的数据进行汇总。所以 share join 实际上就是把一条复杂的 SQL 语句拆分成多个单表操作,拆分完之后,路由到各个节点,或者说分发到各个节点进行执行,然后再把各个节点执行的结果返回 MyCat 当中进行汇总。

image.png

我们如果想使用 catlet 完成 join ,除了需要定义 catlet 的实现类,或者用 MyCat 当中提供的实现类以外,我们还需要用到 MyCat 当中的注解。

在执行SQL语句的时候,我们怎么选择,用不用 catlet 以及用哪一个 catlet 的实现,此时我们需要在 SQL 语句执行之前,加上 MyCat 当中的注解,“/*  */”就是注解。

指定 SQL 语句在执行的时候要使用 MyCat 当中的 share join 的 catlet 。

相关文章
|
1月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
10天前
|
自然语言处理 JavaScript Java
《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
HarmonyOS采用分层架构设计,从下至上分为内核层、系统服务层、框架层和应用层。内核层支持多内核设计与硬件驱动;系统服务层提供核心能力和服务;框架层支持多语言开发;应用层包括系统及第三方应用,支持跨设备调度,确保一致的用户体验。
126 81
|
28天前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
150 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
2天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
2月前
|
Cloud Native 持续交付 云计算
云原生技术在现代IT架构中的转型力量####
本文深入剖析了云原生技术的精髓,探讨其在现代IT架构转型中的关键作用与实践路径。通过具体案例分析,展示了云原生如何赋能企业实现更高效的资源利用、更快的迭代速度以及更强的系统稳定性,为读者提供了一套可借鉴的实施框架与策略。 ####
29 0
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
70 1
|
1月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
2月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
54 3
|
2月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####