tencent cloud

TDSQL-C MySQL 版

动态与公告
产品动态
产品公告
新手指引
产品简介
产品概述
产品优势
应用场景
产品架构
产品规格
实例类型
产品功能列表
数据库版本
地域和可用区
常用概念
使用限制
使用规范建议
自研内核
内核概述
内核版本更新动态
内核优化版本
功能类特性
性能类特性
安全类特性
稳定性特性
分析引擎特性
内核问题检查与修复
购买指南
计费概述
产品价格
创建集群
变配说明
续费说明
欠费说明
退费说明
按量转包年包月
按量转 Serverless
增值服务计费说明
查看费用账单
快速入门
数据库审计
简介
查看审计实例列表
开通审计服务
查看审计日志
日志投递
配置事后告警
修改审计规则
修改审计服务
关闭审计服务
审计规则模板
查看审计任务
授权子用户使用数据库审计
Serverless 服务
Serverless 简介
创建和管理 Serverless 版集群
弹性管理工具
Serverless 资源包
多可用区部署
配置变更
常见问题
Serverless 成本预估器
操作指南
操作总览
控制台切换集群页面视图
数据库连接
实例管理
配置变更
实例形态管理
集群管理
只读实例管理
数据库代理
账号管理
数据库管理
数据库管理工具(DMC)
参数配置
多可用区部署
全球数据库
备份与恢复
操作日志
迁移数据
并行查询
列存索引 CSI
分析引擎
数据库安全和加密
监控与告警
SQL 基本操作
使用 SCF 连接 TDSQL-C MySQL 版
标签
实践教程
TDSQL-C MySQL 版数据库审计等保实践
通过 DTS 升级数据库版本 MySQL5.7至8.0
TDSQL-C MySQL 版使用规范
新版本控制台
数据库代理多连接地址实现多 RO 组
数据库代理的优势
如何选择存储空间计费模式
通过 DTS 构建异地灾备
为集群创建 VPC
如何进行数据恢复
如何解决 CPU 使用率高的问题
如何授权子用户查看监控
白皮书
安全白皮书
性能白皮书
故障处理
连接相关
性能相关
API 文档
History
Introduction
API Category
Making API Requests
Instance APIs
Multi-Availability Zone APIs
Other APIs
Audit APIs
Database Proxy APIs
Backup and Recovery APIs
Parameter Management APIs
Billing APIs
serverless APIs
Resource Package APIs
Account APIs
Performance Analysis APIs
Data Types
Error Codes
常见问题
基础概念
购买与计费
兼容与格式
连接与网络
功能特性
控制台操作
数据库表
性能与日志
数据库审计
TDSQL-C MySQL 版和云数据库 MySQL 有什么区别
相关协议
服务等级协议
服务条款
TDSQL-C 政策
隐私政策
数据处理和安全协议
通用参考
标准与认证
词汇表
联系我们

实现原理

PDF
聚焦模式
字号
最后更新时间: 2023-01-06 11:35:30
本文介绍并行查询功能的实现原理。

并行原理

TDSQL-C MySQL 版推出并行查询(Parallel Query)能力,将完整数据分区下推到不同的线程上,利用多个线程进行并行计算,并将结果汇总到用户线程上,并返回给用户,提升查询效率。

下面用一个简单的例子介绍并行查询的基本原理。
说明:
MySQL/InnoDB 物理存储为段页式,分区单位为页,这里用行演示分区的概念。
给定一个表 t 和如下分组聚合查询。
select x, count(*) from t group by x;
哈希聚合算法(迭代求值)过程如下表所示。算法迭代每一行,更新分组聚合状态。当所有数据行迭代结束时,就得到了分组聚合结果。假设聚合状态更新操作是恒定的,那么算法时间复杂度是 O(n) 的。

如果用 k 个线程来加速这个查询(这里 k = 2),那么最好先将数据表划分成 k * p 个分区(这里 p = 1)。这样,每个线程可以处理 p 个分区,产生一个局部结果。显然,这些局部结果并不是最终结果,还需要进行合并处理。合并操作需要放在同一个用户线程里执行,才能获得正确的最终结果。

由上述示例我们可以将串行查询模式与并行查询模式的运算用算子图表示为:

通过算子图可看到,在并行查询中数据会根据并行度,被拆分为数个不重叠的分区,这一过程被称为数据分区。
在数据分区完成后,原始计划中的特殊运算也会进行拆分,此过程为任务拆分。全部拆分完成后数据会被多个工作线程(并行线程)扫描并执行,工作线程会将各部分结果通过数据交换算子聚集到用户线程,这一过程依赖于数据交换。
数据交换完成后,由用户线程完成聚集操作,汇总结果,将完整结果输出。其中,用户线程负责数据分区和任务分拆,同时充当协调者角色(也称为协调线程),协调多个工作线程并行地执行子任务。用户线程还负责合并最终结果,返回给用户。工作线程执行并行子任务,并通过数据通道交换中间结果。
那么,可以总结并行查询的几个核心要素为:
数据分区:将原始表数据划分成不重叠的分区,并支持按分区读数据。
任务拆分:将原始计划中的特殊运算拆分成“局部-整体”两段运算,除此之外,还要插入数据交换算子,支持跨线程数据传递。
数据交换:支持在不同线程间传递数据。

并行流程

TDSQL-C MySQL 版基于上述原理,实现了整套并行查询计划,将串行处理流程扩展为了并行处理流程,如下图所示。

一条 SQL 语句,在 MySQL 传统的串行流程中为:一条 SQL 语句先进行串行优化,输出串行执行计划,之后执行迭代式模型输出结果,整个过程效率不高。为实现并行查询能力,TDSQL-C MySQL 版全新设计了整套 SQL 语句处理流程:
1. 基于并行查询原理我们可知,整个过程被划分为用户线程和工作线程(并行线程)两部分,所有的流程均在这两类线程中进行。在一条 SQL 语句开始执行后,用户线程会在优化器中根据所设定的参数值对这条语句进行分析,生成对应的执行计划。SQL 优化环境可以简单理解为一个高度抽象的确定性计算模块,其输入是 SQL 和优化环境,输出是执行计划。对于相同的输入,就会有相同的优化路径,产生相同的输出,保证结果的准确性。
2. 生成执行计划后,会进入语句检测阶段,此时计算层会检测该语句是否符合执行并行查询的标准,语句层面检测包括动态查询,数据隔离级别是 RC 或 RR,数据处理量是否足够多代价,执行计划层面检测迭代算子和函数是否可以并行,若不符合要求,该语句会回到串行执行;若符合标准则执行并行查询,进入并行优化阶段。具体支持的语句请参见 并行查询支持的语句场景
3. 在并行优化阶段,计算层会根据需求去选择对哪个表进行数据拆分,并对聚合或排序等操作进行任务拆分,方便各 worker 并行执行。在优化阶段,由于涉及数据划分,为保证划分到每个线程的数据足够均衡,TDSQL-C MySQL 版引入动态分区管理能力,保证一个线程执行多个任务,最大程度避免数据倾斜。
4. 在完成上述一系列流程后,计算层将生成并行查询任务,通过任务副本的方式下推至工作线程,并根据参数设置的值对工作线程数量进行分配与限制,工作线程此时开始执行并行查询操作,各线程并行执行,得到结果后将数据上推至用户线程进行聚合处理,并返回给用户,至此,一条语句完整的并行查询流程执行完毕。
整体流程可以总结为,用户线程收到 SQL 后,经解析、校验和优化等常规步骤,产生串行执行计划,同时搜集优化过程依赖的各种信息(优化环境)。然后,分析串行执行计划(语句检测,实际上是检测算子树、执行环境和优化代价),决定是否启动并行优化。并行优化时将串行算子树划分成粗粒度任务,选定并行表(动态分区)和任务间数据交换算法,并构造任务依赖图。此时,用户线程准备就绪,从可用线程管理器里申请到足够的工作线程,就可以开始调度执行,工作线程完成后,根据并行查询原理,数据通过数据交换至用户线程进行聚合处理,返回给用户完整结果。
在以上流程中,TDSQL-C MySQL 版设置了多种参数方便用户对并行查询能力进行调整,控制语句的执行代价与并行查询造成的资源负载等,并辅以多种监控指标,实时监控与并行查询有关的多项信息,详情请参见 开启或关闭并行查询

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈