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

这篇具有很好参考价值的文章主要介绍了008、体系架构之SQL 执行流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读取的执行

  • 元数据的读取
    008、体系架构之SQL 执行流程
    执行器从information_schema当总获取表的元数据信息(table meta),元数据的信息从内存中读取就可以了,因为已经缓存到了information schema。

  • DistSQL
    008、体系架构之SQL 执行流程
    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
    008、体系架构之SQL 执行流程
    TiKV有算子下推的功能,把一些操作下推到TiKV中,执行计划当中可以看到是叫做cop task 。
    当然有些操作,例如多表关联的数据汇总操作 还是在TiDB Server上 执行计划中可以看到是root task。

写入的执行

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

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

008、体系架构之SQL 执行流程
首先还是有读的操作,将处理的数据读入到memBuffer(有序的KV记录)
找到操作数据发起提交以后,开始进入到两阶段提交。
简单理解为:
一阶段:transaction (修改数据+加锁)
二阶段: commit (添加释放锁的记录+commit)

DDL的执行

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

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

008、体系架构之SQL 执行流程
可以执行在线DDL 不会阻塞DML
同一时刻只能有一个TiDB工作(owner)
schema load: 负责将最新的对象加载进来。

008、体系架构之SQL 执行流程
这个owner是轮询在TiDB Server上的

SQL运算

SQL解析和编译

008、体系架构之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() 的结果上⾯。

整个流程示意图如下:

008、体系架构之SQL 执行流程
这个⽅案是直观且可⾏的,但是在分布式数据库的场景下有⼀些显⽽易⻅的问题:

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

分布式 SQL 运算

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

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

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

SQL 层架构

通过上⾯的例⼦,希望⼤家对 SQL 语句的处理有⼀个基本的了解。实际上 TiDB 的SQL 层要复杂得多,模块以及层次⾮常多,下图列出了重要的模块以及调⽤关系:
008、体系架构之SQL 执行流程
⽤户的 SQL 请求会直接或者通过 Load Balancer 发送到 TiDB Server,TiDB Server 会解析 MySQL Protocol Packet ,获取请求内容,对 SQL 进⾏语法解析和语义分析,制定和优化查询计划,执⾏查询计划并获取和处理数据。数据全部存储在 TiKV 集群中,所以在这个过程中 TiDB Server 需要和 TiKV 交互,获取数据。最后 TiDB Server 需要将查询结果返回给⽤户。文章来源地址https://www.toymoban.com/news/detail-491650.html

到了这里,关于008、体系架构之SQL 执行流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql进阶(一)Mysql执行流程与架构

    ​ 如上很简单的查询语句,从student表中查询id。那么Mysql是如何将这个条语句翻译成它所需要的指令从而去拿到数据返回给客户端?这里先放一张大致的流程图 ​ 首先数据是存储在Mysql服务器端的。应用程序或者工具都是客户端,客户端要去读取数据库,第一步就要跟数据库

    2024年02月05日
    浏览(32)
  • 【TiDB理论知识 07】SQL执行流程

    目录 目录 一 DML语句读写流程概要 1 DML语句读流程概要 2  DML语句写流程概要 二 DDL语句的执行流程概要 SQL解析 Parse 与 编译 Compile 读取的执行 写入的执行 DDL的执行 1 DML语句读流程概要 用户发出SQL 被协议层接收 Protocal Layer 通过PD获取时间戳  parse模块 解析SQL,通过词法解析

    2024年02月15日
    浏览(31)
  • 【MySQL】MySQL中SQL执行流程

    连接器(Connector) : 当客户端发送一个连接请求时,连接器负责接受并建立与MySQL服务器的连接。它进行身份验证、权限验证等操作,并为客户端分配一个会话(Session)。 查询缓存(Query Cache) : 在连接建立后,MySQL可以使用查询缓存来提高查询性能。查询缓存会检查当前

    2024年02月11日
    浏览(55)
  • 区块链知识系列 - 系统学习EVM(一)-架构与执行流程

    EVM有一个基于栈的架构,在一个栈中保存了所有内存数值。EVM的数据处理单位被定义为256位的“字”( 这主要是为了方便处理哈希运算和椭圆曲线运算操作 ) 这里所说的内存数值是指那些EVM字节码运行所需要的输入、输出参数数据和智能合约程序运行中所需要的局部变量等

    2024年02月02日
    浏览(40)
  • MySQL—一条查询SQL语句的完整执行流程

    表结构和数据如下: 我们分析的sql语句如下: 大体来说,MySQL可以分为Server层和存储引擎层两部分: Server层 包括:连接器、查询缓存、分析器、优化器、执行器等 涵盖MySQL的大多数核心服务功能 所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在

    2024年04月28日
    浏览(64)
  • 【手写数据库toadb】SQL解析器的实现架构,create table/insert 多values语句的解析树生成流程和输出结构分析

    ​ 专栏内容 : 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学

    2024年02月05日
    浏览(68)
  • 01 | 基础架构:一条SQL查询语句是如何执行的?

    画出 MySQL 的基本架构图 Server 层和存储引擎层各自有哪些组件? Server 层 连接器 查询缓存 分析器 优化器 执行器 所有内置函数(日期、时间、数学和加密函数等) 所有跨存储引擎的功能(存储过程、触发器、视图等) 存储引擎层 负责数据的存储和读取 连接器的作用? 连接

    2024年02月08日
    浏览(61)
  • 从Mysql架构看一条查询sql的执行过程

    我们的程序或者工具要操作数据库,第一步要做什么事情? 跟数据库建立连接。 首先,MySQL必须要运行一个服务,监听默认的3306端口。在我们开发系统跟第三方对接的时候,必须要弄清楚的有两件事。 第一个就是通信协议,比如我们是用HTTP还是WebService还是TCP? 第二个是消

    2024年02月08日
    浏览(56)
  • 数据中台通用体系架构

    不同的企业对数据有不同的需求。企业数据应用不断更新迭代,企业的中台系统也需要不断变化。 从数据处理与数据治理两个维度出发,可以设计一个解耦的数据中台体系架构。该数据中台体系架构具有一定的柔性,可按照企业应用需求进行组合,或者对单个模块进行扩充,

    2024年02月03日
    浏览(39)
  • 一条SQL如何被MySQL架构中的各个组件操作执行的?

    简单用一张图说明下, MySQL 架构有哪些组件,接下来给大家用 SQL 语句分析 假如 SQL 语句是这样 SELECT class_no FROM student WHERE name = \\\'lcy\\\' AND age 18 GROUP BY class_no 其中 name 为索引,我们按照 时间顺序 来分析一下 客户端:客户端(如 MySQL 命令行工具、 Navicat 、 MySQL Workbench 或其他应

    2023年04月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包