008、体系架构之SQL 执行流程

news2024/12/22 19:09:17

SQL 执行流程

  • 读取的执行
  • 写入的执行
  • DDL的执行
  • SQL运算
    • SQL解析和编译
    • SQL 层架构
    • SQL 运算
    • 分布式 SQL 运算
    • SQL 层架构

读取的执行

  • 元数据的读取
    在这里插入图片描述
    执行器从information_schema当总获取表的元数据信息(table meta),元数据的信息从内存中读取就可以了,因为已经缓存到了information schema。

  • DistSQL
    在这里插入图片描述
    DistSQL:除了点查的语句,例如对多表(t1 t2)的关联查询,转成单表查询(select * from t1 where xx ) (select * from t2 where xx) 再做处理, 将简单SQL 下发到TiKV 。相当于将TikV 和复杂的SQL做个解耦合。

  • UnifyRead Pool
    TiKV接收到这些SQL语句后,会首先构造快照对象(某个时间点的内容)。
    这些简单SQL语句会都进入到UnifyRead Pool线程池。 (按优先级执行这些SQL)

  • Rocksdb KV读取数据
    然后按层次到Rocksdb kv数据读取。
    注意一点: 这个region可能在不同的tikv上,所以可以并行查询,这就是为什么叫DistSQL
    在这里插入图片描述
    TiKV有算子下推的功能,把一些操作下推到TiKV中,执行计划当中可以看到是叫做cop task 。
    当然有些操作,例如多表关联的数据汇总操作 还是在TiDB Server上 执行计划中可以看到是root task。

写入的执行

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
首先还是有读的操作,将处理的数据读入到memBuffer(有序的KV记录)
找到操作数据发起提交以后,开始进入到两阶段提交。
简单理解为:
一阶段:transaction (修改数据+加锁)
二阶段: commit (添加释放锁的记录+commit)

DDL的执行

在这里插入图片描述

  • TiDB Server发出的ddl语句,不一定是它执行,谁是owner 谁执行。
  • 添加索引的语句放到 add index queue

在这里插入图片描述
可以执行在线DDL 不会阻塞DML
同一时刻只能有一个TiDB工作(owner)
schema load: 负责将最新的对象加载进来。

在这里插入图片描述
这个owner是轮询在TiDB Server上的

SQL运算

SQL解析和编译

在这里插入图片描述
SQL解析和编译; AST语法树
optimize 包括:逻辑优化(例如子表查询转为连接查询)和物理优化(例如根据行数,判断是否使用索引等) 找到最优算子 生成 执行计划。

SQL 层架构

  • TiDB 的 SQL 层,即 TiDB Server,负责将 SQL 翻译成 Key-Value 操作,将其转发给共⽤的分布式 Key-Value 存储层 TiKV,然后组装 TiKV 返回的结果,最终将查询结果返回给客户端。
  • 这⼀层的节点都是⽆状态的,节点本身并不存储数据,节点之间完全对等。

SQL 运算

最简单的⽅案就是通过上⼀节所述的表数据与 Key-Value 的映射关系⽅案,将 SQL查询映射为对 KV 的查询,再通过 KV 接⼝获取对应的数据,最后执⾏各种计算。

⽐如 select count(*) from user where name = "TiDB" 这样⼀个 SQL 语句,它需要读取表中所有的数据,然后检查 name 字段是否是 TiDB ,如果是的话,则返回这⼀⾏。

具体流程如下:

  • 构造出 Key Range:⼀个表中所有的 RowID 都在 [0, MaxInt64) 这个范围内,使⽤ 0 和 MaxInt64 根据⾏数据的 Key 编码规则,就能构造出⼀个[StartKey, EndKey) 的左闭右开区间。
  • 扫描 Key Range:根据上⾯构造出的 Key Range,读取 TiKV 中的数据。
  • 过滤数据:对于读到的每⼀⾏数据,计算 name = “TiDB” 这个表达式,如果为真,则向上返回这⼀⾏,否则丢弃这⼀⾏数据。
  • 计算 Count() :对符合要求的每⼀⾏,累计到 Count() 的结果上⾯。

整个流程示意图如下:

在这里插入图片描述
这个⽅案是直观且可⾏的,但是在分布式数据库的场景下有⼀些显⽽易⻅的问题:

  • 在扫描数据的时候,每⼀⾏都要通过 KV 操作从 TiKV 中读取出来,⾄少有⼀次RPC 开销,如果需要扫描的数据很多,那么这个开销会⾮常⼤。
  • 并不是所有的⾏都满⾜过滤条件 name = “TiDB” ,如果不满⾜条件,其实可以不读取出来。此查询只要求返回符合要求⾏的数量,不要求返回这些⾏的值。

分布式 SQL 运算

为了解决上述问题,计算应该需要尽量靠近存储节点,以避免⼤量的 RPC 调⽤。⾸先,SQL 中的谓词条件 name = “TiDB” 应被下推到存储节点进⾏计算,这样只需要返回有效的⾏,避免⽆意义的⽹络传输。然后,聚合函数 Count() 也可以被下推到存储节点,进⾏预聚合,每个节点只需要返回⼀个 Count() 的结果即可,再由 SQL 层将各个节点返回的 Count(*) 的结果累加求和。

以下是数据逐层返回的示意图:

在这里插入图片描述

SQL 层架构

通过上⾯的例⼦,希望⼤家对 SQL 语句的处理有⼀个基本的了解。实际上 TiDB 的SQL 层要复杂得多,模块以及层次⾮常多,下图列出了重要的模块以及调⽤关系:
在这里插入图片描述
⽤户的 SQL 请求会直接或者通过 Load Balancer 发送到 TiDB Server,TiDB Server 会解析 MySQL Protocol Packet ,获取请求内容,对 SQL 进⾏语法解析和语义分析,制定和优化查询计划,执⾏查询计划并获取和处理数据。数据全部存储在 TiKV 集群中,所以在这个过程中 TiDB Server 需要和 TiKV 交互,获取数据。最后 TiDB Server 需要将查询结果返回给⽤户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python抓取商品详情方法的几种方法比较

抓取商品详情的方法有很多种,以下是其中几种常见的方法及其优缺点: 1.使用requests库发送HTTP请求,然后解析HTML或JSON格式的数据: 优点:这种方法可以抓取几乎所有网站上的数据,支持GET和POST请求&#xff…

匿名内部类为什么泄漏,Lambda为什么不泄漏

作者:麦客奥德彪 在Android开发中,内存泄露发生的场景其实主要就两点,一是数据过大的问题,而是调用与被调用生命周期不一致问题,对于对象生命周期不一致导致的泄漏问题占90%,最常见的也不好分析的当属匿名内…

一段2个月工作经历没体现,美团背调没通过收回了offer

众所周知,很多公司在面试通过之后还会对求职者进行背景调查,这是企业确认求职者信息真实性的重要途径,具有减少信息不对称、降低用人风险等重要意义。 一般通过背景调查,如果企业了解到求职者劳动关系没有终止、解除、简历造假或…

抖音的外卖服务商申请详细指南!

CKA-外卖服务商对外(5、6双月) 项目背景: 通过资源牵引助力商户交易增长,从组品、内容、流量等方面对客户进行1v1精细化辅导,帮助商户进行运营动作 的优化,以实现双月百万交易额的showcase打造,并以此完成“好商,好品…

面了个00后的测试员,年薪20w问题基本都能回答上,必是刷了不少面试题···

互联网行业竞争是一年比一年严峻,作为测试工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯等大厂.....) 所以,大家就迎来了…

从云端进行安全日志管理

随着企业变得越来越动态,需要一个灵活且易于访问的日志管理解决方案。Log360 Cloud 从本地和基于云的数据中收集您的网络日志,将其存储在云中,并通过多个实时/自动更新的图形仪表板实时提供网络安全的全面视图。 为什么选择云日志记录 随时…

数据中心交换机和园区交换机有啥区别?

概要 在网络架构中,交换机是一种重要的设备,用于连接计算机、服务器和其他网络设备。随着不同领域的需求,交换机也有多种类型。本文将详细介绍数据中心交换机和园区交换机之间的区别,包括它们的原理和使用场景。 一. 数据中心交换…

16.算法之字符串匹配算法

前言 字符串匹配是我们在程序开发中经常遇见的功能,比如sql语句中的like,java中的indexof,都是用来判断一个字符串是否包含另外一个字符串的。那么,这些关键字,方法,底层算法是怎么实现的么?本节,我们来探…

STM32_智慧农业环境测控系统(附代码)

前段时间进行了说STM32的学习,现在把学习成果共享出来,仅供参考。 实验目标:对环境温度湿度以及光照值进行检测(传感器)和控制(按键)。 硬件资源:STM32开发板、DHT11温湿度传感器和光敏传感器。 #include "st…

uview-ui表单使用总结

官网地址:https://v1.uviewui.com 表单校验的规则注意点: uView自带验证规则 常用的手机号身份证之类的都可以直接用内置校验规则地址 使用方法: this.$u.test.mobile(val)如果是动态配置的表单,使用v-for循环,校验规…

贪心算法原理和案例

目录 ​编辑 贪心算法简介 什么时候使用贪心算法 贪心算法缺陷 贪心算法应用 贪心算法JAVA代码实现 贪心算法简介 贪心算法(又称贪婪算法)Greedy Algorithm 是一种不断做出局部最优解的选择,最终期望得到全局最优解的算法。 简单地说&am…

SpringCloud Ribbon初步应用(十)

Ribbon是客户端负载均衡&#xff0c;所以肯定集成再消费端&#xff0c;也就是consumer端 修改microservice-student-consumer-80 引入依赖&#xff0c;pom.xml 加入 ribbon相关依赖 <dependency> <groupId>org.springframework.cloud</groupId> &…

淦、我的服务器又被攻击了

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 最近老是有粉丝问我&#xff0c;被黑客攻击了&#xff0c;一定要拔网线吗&#xff1f;还有…

Python进阶语法之三元表达式详解

Python进阶语法之三元表达式详解 Python的三元表达式&#xff08;Ternary Expressions&#xff09;是一种简洁高效的编写条件逻辑的方式。与许多其他编程语言一样&#xff0c;Python也提供了三元表达式&#xff0c;可以在一行代码中写出一个if-else条件语句。在这篇博文中&…

Webpack+Babel手把手带你搭建开发环境(内附配置文件)

先简单介绍一下Webpack和Babel Webpack webpack工作就是打包&#xff0c;只要你安装的插件就可以打包一切&#xff0c;并且会自动解析依赖项&#xff0c;是前端的热门工具。Babel Ecmascript的代码一直在更新 但是浏览器的兼容却没有根上&#xff0c;babel就实现了利用服务端n…

【数据分享】1929-2022年全球站点的逐月平均能见度(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到常用的能见度数据&#xff0c;最详细的能见度数据是具体到气象监测站点的能见度数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929…

Jmeter分布式压力测试

目录 1、场景 2、原理 3、注意事项 4、slave配置 5、master配置 6、脚本执行 注意&#xff1a; 1、场景 在做性能测试时&#xff0c;单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C…

Pytest教程__跳过用例的执行(7)

pytest跳过用例执行的用法与unittest跳过用例大致相同。 pytest跳过用例的方法如下&#xff1a; pytest.mark.skip(reason)&#xff1a;无条件用例。reason是跳过原因&#xff0c;下同。pytest.mark.skipIf(condition, reason)&#xff1a;condition为True时跳过用例。 pyte…

一文了解清楚前景无限的高性能计算工程师工作内容,原来和码农区别这么大 ...

随着我国对科研基建的重视以及超算互联网的部署工作正式开展&#xff0c;越来越多的人关注到了一块蓝海的就业宝藏——高性能计算工程师。当今一位高性能计算工程师人才可谓抢手至极&#xff0c;尽管年薪高涨&#xff0c;但是依然供不应求。这是未来30年都比较需要的工程技术人…

java基础(多线程)-wait/notify

一、wait/notify的原理 Owner线程发现条件不满足&#xff0c;调用wait方法&#xff0c;即可进入WaitSet变为WAITING状态 BLOCKED和WAITING的线程都处于阻塞状态&#xff0c;不占用CPU时间片BLOCKED线程会在Owner线程释放锁时唤醒WAITING线程会在Owner线程调用notify或notifyAll…