当前位置: 首页 > news >正文

无需业务改造,一套数据库满足 OLTP 和 OLAP,GaiaDB 发布并行查询能力

在企业中通常存在两类数据处理场景,一类是在线事务处理场景(OLTP),例如交易系统,另一类是在线分析处理场景(OLAP),例如业务报表。

OLTP 数据库擅长处理数据的增、删、改,以及小数据量的查询,更侧重数据的实时响应、高吞吐和事务性等要求。OLAP 则以大数据量的复杂查询为主,更侧重数据容量的扩展性、复杂计算能力等要求。

为了满足这两类业务场景,企业通常会采用 OLTP + OLAP 的组合方案或者分布式HTAP 数据库的产品方案。

  • 使用 OLTP + OLAP 的组合方案。他是采用分而治之的设计思路,不同的业务场景跑在各自擅长的数据库上,再通过 ETL 进行数据的异步同步。该方案能满足复杂的业务场景,但需要企业具有较强的 IT 能力。
  • 使用具备 HTAP 能力的分布式数据库。这类方案通过 zeroETL 屏蔽了 OLTP 和 OLAP 之间数据同步的复杂性,达到了简化业务架构效果,可以满足一些「重 TP 轻 AP」的场景。不过,这个方案涉及业务全面支持分布式改造。

图片

除了以上两种方案,是否有更加轻量化的解决方案,用一套数据库同时满足 TP(事务处理) 和 AP(复杂分析处理)业务呢?

很多企业用户由于找不到更加低成本、轻改造、易上手的解决方案,业务不得不勉强使用 TP 类型的数据库 MySQL 来承载 AP 业务。

GaiaDB 4.0 新增并行查询能力

大家最早认识云原生数据库 GaiaDB 是作为「MySQL Plus」的替代品,100% 兼容 MySQL,扩展性和性能又远超于开源 MySQL,所以 GaiaDB 在海量数据、高吞吐的场景,可以平滑替代 MySQL。

在 GaiaDB 4.0 之前,GaiaDB 像 MySQL 一样,无法很好支持复杂的分析处理需求,一条复杂的查询通常要处理几十秒甚至更长时间。

为了解决这个问题,GaiaDB  4.0 针对在线实时的分析业务发布了并行查询能力,使得业务在同一套集群上,无需任何改造即可满足复杂分析的需求。

众所周知,软件性能的提升一方面源于 CPU 硬件能力的增强,另一方面也得益于软件设计能够充分利用 CPU 的计算资源。

在 MySQL 的各个版本中,单个查询的执行通常是在一个独立的线程中完成,即对应一个 CPU 核。然而,在多核 CPU 下,仅依赖单个线程来执行查询无法充分利用硬件资源,特别是当涉及到 I/O 密集型操作或复杂查询时。

故 MySQL 在处理复杂查询时会有性能瓶颈,并且无法单纯通过提高资源配置解决这个问题。因此,简单的解决方案是充分利用 CPU 的多核计算资源,让多个核参与到计算任务中,这样才能大幅度提升查询计算的处理能力。

下图是 GaiaDB 利用多核资源并行计算一个表的 count(*) 过程的例子:表数据进行切块后,分发给多个 CPU 核进行并行计算,每个核计算部分数据得到一个中间 count(*) 结果,并在最后阶段将所有中间结果进行聚合得到最终结果。相比单线程处理的计算方式,GaiaDB 处理复杂查询任务的性能提升 1 到 2 个量级。

图片

技术实现思路

GaiaDB 并行查询技术的整体实现思想是对能够并行的查询算子(scan、gather等)进行并行化,在执行查询任务时将数据分片并启动若干个工作线程分别计算,最后将结果汇总返回给客户端。同时 GaiaDB 并行执行增加数据交互算子(stream),实现多个工作线程之间的数据交互,确保查询的正确性,完成整体的查询。

如下图,通过对算子进行线程拆分,将完整数据分区下推到不同的 worker 线程上,利用多个线程进行并行计算,并将结果汇总到 leader 线程上,leader 对返回的数据进行汇总处理并返回给用户。

图片

scan 算子并行化

在火山模型中,每个算子除了包括基础的构造函数外,都包含 Init 和  Read 函数,Init 函数做执行前的一些准备工作,Read 函数向下层算子发送命令并返回数据到上层算子。

Init 接口实现:并行扫描算子需要在扫描前将需要扫描的表提前切分成 partition,并放入 Ctx(execution context) 中。

并行扫描算子 Read接口设计:Read 接口中需要实现从 Ctx 中 dequeue 当前的 Ctx,并标记为 m_cur_ctx。根据 m_cur_ctx 中的 scan_ctx,拿到 execution context 信息,返回当前 m_cur_ctx 的第一个 record,并记录下一个 record 的位置,待下一次读取。m_cur_ctx 扫描完成后,从 m_ctxs 中取得下一个 ctx,重复读取以取完所有的数据。

ParallelTblScanIterator 与 TableScanIterator 的区别在于,并行扫描算子 ParallelTblScanIterator 将一个全表扫描任务划分成多个ctx 的子任务,便于多个线程协作,而 TableScanIterator 无法将任务拆分成多个子任务,导致无法并行执行。

scan 算子的示例说明,我们可以看到如下执行计划,表的整个扫描是串行进行的。

图片

当开启并行查询后,启动了多个 worker 线程进行并行执行,然后在 gather 阶段将每个线程查询的结果进行聚合并返回。

图片

gather 算子并行化

gather 算子是承上启下的算子,其主要功能是将上下文等执行相关信息传递给 worker 线程,同时将返回的数据经过处理后返回给 client。

gather 算子将原来执行 query 的单个线程,拆分成一对多的线程模型。gather 算子在 read 时创建新的线程,并拷贝执行所需要的所有变量,转由另外的线程执行,leader 线程在 message queue 中等待数据返回。ParallelWorkerArray 包括所有的 worker 信息,由 gather 算子维护清理。

gather 算子除了完成简单的数据转发功能外,还需要完成简单的计算。举例来说,假设每个 worker 线程的结果是 sum 函数结果,那么 gather 算子需要将各个 worker 线程的结果加起来。假设 query 最后需要排序,则 leader 线程需要将各个 worker 线程的结果重新排序后返回。

更多算子并行化

GaiaDB 支持多种类型的并行查询算子,以满足客户各种不同复杂查询场景。已经支持的并行查询算子包括:

  • 并行过滤(Filter)算子:where/having 等;
  • 并行扫描(Scan)算子:Projection 等;
  • 并行连接(Join)算子:HashJoin、NestLoopJoin、SemiJoin 等;
  • 并行聚合(Agg)算子:SUM/AVG/COUNT/BIT_AND/BIT_OR/BIT_XOR 等;
  • 并行排序(Sort)算子:order by;
  • 并行分组(group by)算子:group by;
  • 其他并行算子:limit(Limit/Offset),UNION 等。

GaiaDB 并行性能测试

下图是 GaiaDB 针对 TPC-H 查询场景的性能测试结果。与传统 MySQL 单线程相比,在 32 线程并行执行下,GaiaDB 单表复杂查询性能最高提升 14 倍,平均提升 8+ 倍。

测试环境:32 核,2 个 numa node,Intel(R) Xeon(R) Silver 4110 CPU @ 2.10 GHz,内存 128 GB,测试数据量 100 GB,并发线程数据 32。

图片

如图,32 核 CPU 利用率最高提升到 100%。

图片

开启 GaiaDB 并行查询

GaiaDB 提供 2 种启动并行查询的方法:

例如:采用默认的参数配置,同时指定并发度为 8:SELECT /*+ PQ(8) */ … FROM …

  1. 通过修改 GaiaDB 集群的全局参数开启并行查询能力。参数如下:
    • SET force_parallel_execute=ON 开启并行查询;

      parallel_default_dop=4 控制使用多少线程并行执行,默认并发度为 4;

      parallel_cost_threshold=1000 控制执行代价多大时,开启并行执行,默认是 1000;

  2. 通过使用 HINT 方式,在指定的 SQL 语句上开启并行查询能力。语法:SELECT /*+ PQ(并发度) */ … FROM …

另外一个提升复杂查询性能的方法

通过并行查询的方式,GaiaDB 将 CPU 资源和存储 I/O 充分利用起来,大幅提升复杂查询的处理性能。

除此之外,云原生数据库 GaiaDB  4.0 还推出了另外一个性能提升利器 — 列存索引技术,通过在数据表上为指定列创建列存索引,能够进一步加速查询性能。

相关文章:

无需业务改造,一套数据库满足 OLTP 和 OLAP,GaiaDB 发布并行查询能力

在企业中通常存在两类数据处理场景,一类是在线事务处理场景(OLTP),例如交易系统,另一类是在线分析处理场景(OLAP),例如业务报表。 OLTP 数据库擅长处理数据的增、删、改&#xff0c…...

PHP 表单验证:邮件和URL

PHP 表单验证:邮件和URL 在Web开发中,表单验证是一个至关重要的环节,它确保了用户输入的数据的有效性和安全性。特别是在处理邮件地址和URL时,准确的验证尤为重要。本文将详细介绍如何使用PHP来验证表单中的邮件地址和URL。 邮件…...

前端八股文 路由的懒加载

为什么会有 路由的懒加载 在现代单页应用(SPA)的开发中,路由懒加载是一种提升应用性能的关键技术。通过按需加载组件,而非在应用启动时一次性加载所有模块,可以显著减少初次加载时间和资源消耗。本文旨在深入探讨前端…...

HarmonyOS Web组件(二)

1. HarmonyOS Web组件 官方文档 1.1. 混合开发的背景和好处 混合开发(Hybrid Development)是一种结合原生应用和Web应用的开发模式,旨在同时利用两者的优势。随着移动应用需求的多样化和复杂化,单一的开发方式往往难以满足所有…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号2

基础认证题库请移步:HarmonyOS应用开发者基础认证题库 注:有读者反馈,题库的代码块比较多,打开文章时会卡死。所以笔者将题库拆分,单选题20个为一组,多选题10个为一组,题库目录如下,…...

基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用

目录 专题一、深度学习发展与机器学习 专题二、深度卷积网络基本原理 专题三、TensorFlow与Keras介绍与入门 专题四、PyTorch介绍与入门 专题五、卷积神经网络实践与遥感图像场景分类 专题六、深度学习与遥感图像检测 专题七、遥感图像检测案例 专题八、深度学习与遥感…...

叶再豪降龙精英课程总结

文章目录 1.思维认知1.1 稻盛和夫成功公式1.2 龙头主升模式1.3 龙头主升-两种路径1.4 股市新手的炒股思路1.5 龙头案例1.6 降龙心法 2.情绪周期2.1 情绪周期2.1 情绪演绎周期2.2 情绪的四个部分2.2.1 指数的情绪周期2.2.3 热点情绪周期2.2.4 热点情绪演绎周期2.2.5 大热点支线2…...

算法 - 查找算法(顺序、折半、红黑树、AVL树、B+树、散列)

查找 顺序查找 查找算法原理: 顺序查找是一种简单的查找方法,从数组的第一个元素开始,依次比较每个元素,直到找到目标元素或者数组结束为止。 实现步骤: 从数组的第一个元素开始。逐一比较数组中的元素与目标值。如…...

TCP与UDP网络编程

网络通信协议 java.net 包中提供了两种常见的网络协议的支持: UDP:用户数据报协议(User Datagram Protocol)TCP:传输控制协议(Transmission Control Protocol) TCP协议与UDP协议 TCP协议 TCP协议进行通信的两个应用进程:客户端、服务端 …...

媲美Midjourney-v6,Kolors最新文生图模型部署

Kolors模型是由快手团队开发的大型文本到图像生成模型,专门用于将文本描述转换成高质量的图像。 Kolors模型支持中英文双语输入,生成效果与Midjourney-v6相媲美,能够处理长达256个字符的文本输入,具备生成中英文文字的能力。 Ko…...

深度学习程序环境配置

深度学习环境配置 因为之前轻薄本没有显卡跑不起来,所以换了台电脑重新跑程序,故记录一下配置环境的步骤及常见错误 本人数学系,计算机部分知识比较匮乏,计算机专业同学可以略过部分内容 深度学习环境配置 深度学习环境配置 CUD…...

【STM32 HAL库】全双工I2S+双缓冲DMA的使用

1、配置I2S 我们的有效数据是32位的,使用飞利浦格式。 2、配置DMA **这里需要注意:**i2s的DR寄存器是16位的,如果需要发送32位的数据,是需要写两次DR寄存器的,所以DMA的外设数据宽度设置16位,而不是32位。…...

【Spring Boot】网页五子棋项目中遇到的困难及解决方法

目录 一、HikariPool-1 - Starting异常二、Invalid bound statement (not found)异常三、The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary异常四、The server time zone value时区报错异常五、补充知识点…...

营销策划方案模板

这应该是目前最详细最完整的营销策划方案模板,营销公司内部都在使用的标准版本,你可以根据自己的营销内容直接填入这个模板,很快就能写好一份至少80分的营销策划方案。 如果暂时用不到也可以先收藏,以备不时之需。 废话不多说&a…...

Python入门基础教程(非常详细)

现在找工作真的越来越难了!今年更是难上加难 前几天在网上刷到这样一条热搜: #23岁找工作因年龄大被HR拒绝了# 是这个世界疯了还是我疯了? 合着只想要有20年以上工作经验的应届毕业生是吧 这好像就是现在的就业市场现状:“35岁…...

LeetCode 常见题型汇总

前30 22 生成括号 剪枝 51 N皇后 37 解数独 二分查找 69 求平方根 字典树 位运算 191 求1的个数 231 2的N次方 338 求0到N的比特位为1的个数 动态规划 并查集 LRU缓存 布隆过滤器...

el-select选择器修改背景颜色

<!--* FilePath: topSearch.vue* Author: 是十九呐* Date: 2024-07-18 09:46:03* LastEditTime: 2024-07-18 10:42:03 --> <template><div class"topSearch-container"><div class"search-item"><div class"item-name&quo…...

Shell程序设计

各位看官&#xff0c;从今天开始&#xff0c;我们进入新的专栏Shell学习&#xff0c;Shell 是操作系统的命令行界面&#xff0c;它允许用户通过输入命令与操作系统交互。常见的 Shell 有 Bash 和 Zsh&#xff0c;它们可以执行用户输入的命令或运行脚本文件。Shell 广泛应用于系…...

PyQT6---环境搭建

1、虚拟环境搭建 创建虚拟环境 create -n pyqt6_39 python3.9 切换虚拟环境 conda activate pyqt6_39 2、安装pyqt6 安装pyqt6和pyqt6-tools pip install PyQt6 -i https://pypi.tuna.tsinghua.edu.cn/simplepip install pyqt6-tools -i https://pypi.tuna.tsinghua.edu.cn/…...

whisper-api语音识别语音翻译高性能兼容openai接口协议的开源项目

whisper-api 介绍 使用openai的开源项目winsper语音识别开源模型封装成openai chatgpt兼容接口 软件架构 使用uvicorn、fastapi、openai-whisper等开源库实现高性能接口 更多介绍 https://blog.csdn.net/weixin_40986713/article/details/138712293 使用说明 下载代码安装…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...