【TiDB理论知识 07】SQL执行流程

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

目录

目录

一 DML语句读写流程概要

1 DML语句读流程概要

2  DML语句写流程概要

二 DDL语句的执行流程概要

SQL解析 Parse 与 编译 Compile

读取的执行

写入的执行

DDL的执行


一 DML语句读写流程概要

1 DML语句读流程概要

【TiDB理论知识 07】SQL执行流程,tidb

用户发出SQL

被协议层接收 Protocal Layer

通过PD获取时间戳 

parse模块 解析SQL,通过词法解析 与 语法解析 生成AST语法树

编译SQL Compile模块 ,区分点查 与 非点查,生成执行计划 发送给Executor,从TIKV获取数据 返回给用户

2  DML语句写流程概要

【TiDB理论知识 07】SQL执行流程,tidb

写流程和读流程前面差不多 ,需要先把数据读出来 

二 DDL语句的执行流程概要

【TiDB理论知识 07】SQL执行流程,tidb

在集群中有多个TiDB server  .可能有多个DDL 发送到TiDB server上。但是同一时刻只能有一个TiDB server的workers在做DDL

用户发出DDL语句 由模块 start job 模块接收,然后放到job queue队列中。

在同一时刻 只有一个TiDB server的角色为owner ,owner角色的 TiDB server的worker才能中从 job queue队列中取DDL,执行完成之后放到history  queue中。

owner 角色有任期,并不是固定在一个TiDB server上。

当成为owner后 ,schema load 会收集所有表的元数据。

队列放到TiKV上主要是为了持久化存储,一旦发生宕机断电可以防止数据丢失。

SQL解析 Parse 与 编译 Compile

【TiDB理论知识 07】SQL执行流程,tidb

用户发出SQL ,由协议层接收 , PD Client 请求PD 获取TSO ,这条SQL语句起始时间,Parse模块对SQL进行语法解析 词法解析yacc, 转化为AST 语法树,语法树被传递到 Compile模块,细分有三步  1 Proprocess预处理阶段 检测SQL合法性 名称是否正确,绑定的信息等,另外还会 判断是否为点查 (比如通过唯一索引 主键索引的等值查询),这样就不用在走后面的流程,直接执行。如果不是点查 ,则还需要走后面的优化流程,分为逻辑优化 (主要是根据关系代数,等价交换的一些规则对SQL语句进行逻辑的变换,比如外连接转换为内连接),逻辑优化之后就是  物理优化 主要是基于逻辑优化的结果 结合表的统计信息(表的行数,列的选择度 ,直方图等等)选择最优的算子,从Compile模块出来的就是物理执行计划 ,就可以去TiKV中取数。

读取的执行

【TiDB理论知识 07】SQL执行流程,tidb

有了执行计划之后 读取的流程 主要设计的模块 在TIDB server中 

Executor 执行器

KV 专门负责点查的

DistSQL 执行复杂SQL的 

PD Clent 负责与PD沟通

TiKV Client 通过这个出入口与TiKV 交互

Executor 需要做两件事 1 获取元数据,在TIDB  启动的时候 ,information schema是存储了元数据的,已经被载入到Tidb Server的缓存中了,所以直接读缓存就可以了。2 另外还有KEY所在的Region ,Region所在的TiKV等这些信息存储在PD中,所以还需要访问PD,但是TiDB Server 与 PD 是通过网络交互的 ,频繁的交互有很大的网络压力,如何解决 把读取过的信息缓存在TIKV Client的 Region Cache中,下一次再读取相同的Region的时候就去 Region Cache中读取即可。如果存储Region的TIKV发生了变化(region 分裂 合并 过期等) ,根据TIKV Client的 Region Cache的信息就获取不到数据,然后就需要返回,这种现象叫做back Off,出现back Off响应就会延迟, 就会再去PD中读取一次。因为PD中的数据是最新的。

下面就可以去TIKV中读数据了。

【TiDB理论知识 07】SQL执行流程,tidb

DIstSQL 是一个 抽象层 ,把复杂的SQL语句转换为对单表的简单查询,之后在去下发给TIKV ,这样就相当于吧复杂SQL与TIKV 进行了解耦合。

TIKV接收到SQL请求之后 ,首先会构造一个快照,snapshot,一个特定时间点的数据,比如我十点发出SQL,这样查询的数据永远是十点的。从TIDB 5.0之后无论是点查还是复杂查询 查都会进入到 UnifyRead Pool  线程池 ,按照优先级执行这些查询的 ,然后到rocksdb  kv中查询,rocksdb kv的查询也是分层的 由上而下 blockCache -->MEMTable--> Immutable -->MEMTable,  可以参考 【TiDB理论知识 03】TiKV-持久化与数据读取_DBA之路的博客-CSDN博客

这样数据就取出来了。

单表的SQL不一定在一个TIKV上,这个时候可以并行查询 。TIKV 还具有算子下推功能,会帮助TiDB 做数据的过滤和聚合 ,这种叫做 cop task 。还有一部分 TIKV 没有办法 比如做T1 T2 T3表的三表连接 ,数据可能散落在各个TIKV上 ,只能把数据先放到 TIDB的内存中 ,然后再做表连接 ,叫做 root task

写入的执行

需要把修改的数据读入到 membuffer中 ,读入的操作和 之前讲的流程是一样的。咱们从数据已经读入到membuffer中开始 ,

TIDB Server 中 与事务写入的模块主要有三个 

Transction

KV 

TiKV  Client

流程

Transction 进入两阶段提交 

TIKV 

写请求发送给 Scheduler ,负责协调并发写入的冲突,并将收到的修改操作向下写入,当又并发写入同一个key的时候,用latch 管理冲突 ,谁拿到latch就可以写入

RaftStore 这个模块主要是将写请求转换为Raft log 之后 像两个地方分发 ,持久化到本地,另外向其他副本发送

Apply  线程组 顺序读取这些Raft  log 应用到 Rocksdb KV中。

RocksDB 是如何写入 参考 

DDL的执行

【TiDB理论知识 07】SQL执行流程,tidb

TIDB 支持 online DDL,DDL执行过程中不会阻塞DML的 

确定自己是不是owner  ,把DDL 放到 TIkV的 job queue队列中 ,角色为owner的TIDB Server会定期查看job queue ,执行完毕后会放到history  queue队列中 

Owner 角色 是轮循的 

add index queue  是个比较特殊的队列 唯独加索引是放到 add index queue 队列中 。加列,修改列的属性都是放到 job queue中

schema load 负责把表的最新的表结构载入到TIDB server 。文章来源地址https://www.toymoban.com/news/detail-617427.html

到了这里,关于【TiDB理论知识 07】SQL执行流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • TiDB Serverless Branching:通过数据库分支简化应用开发流程

    2023 年 7 月 10 日,TiDB Serverless 正式商用。这是一个完全托管的数据库服务平台(DBaaS),提供灵活的集群配置和基于用量的付费模式。紧随其后,TiDB Serverless Branching 的测试版也发布了。 TiDB Serverless Branching 功能使用户能够为其 TiDB Serverless 集群创建分支。这些分支可以实现并

    2024年02月10日
    浏览(48)
  • TiDB数据库从入门到精通系列之四:SQL 基本操作

    成功部署 TiDB 集群之后,便可以在 TiDB 中执行 SQL 语句了。因为 TiDB 兼容 MySQL,你可以使用 MySQL 客户端连接 TiDB,并且大多数情况下可以直接执行 MySQL 语句。 SQL 是一门声明性语言,它是数据库用户与数据库交互的方式。它更像是一种自然语言,好像在用英语与数据库进行对

    2024年02月12日
    浏览(60)
  • 基于Flink CDC实时同步PostgreSQL与Tidb【Flink SQL Client模式下亲测可行,详细教程】

    操作系统:ubuntu-22.04,运行于wsl 2【 注意,请务必使用wsl 2 ;wsl 1会出现各种各样的问题】 软件版本:PostgreSQL 14.9,TiDB v7.3.0,flink 1.7.1,flink cdc 2.4.0 已有postgre的跳过此步 (1)pg安装 https://zhuanlan.zhihu.com/p/143156636 (2)pg配置 可能出现的问题 sudo -u postgres psql 报错: psql: err

    2024年02月11日
    浏览(35)
  • TiDB(2):TiDB架构特性

    1 TiDB 整体架构 TiDB 集群主要包括三个核心组件:TiDB Server,PD Server 和 TiKV Server。此外,还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator 组件。 架构图解   1.1 TiDB Server TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所

    2024年02月12日
    浏览(43)
  • TiDB(5):TiDB-读取历史数据

    接下来介绍 TiDB 如何读取历史版本数据,包括具体的操作流程以及历史数据的保存策略。 1 功能说明 TiDB 实现了通过标准 SQL 接口读取历史数据功能,无需特殊的 client 或者 driver。当数据被更新、删除后,依然可以通过 SQL 接口将更新/删除前的数据读取出来。 另外即使在更新

    2024年02月12日
    浏览(62)
  • TiDB(6):数据迁移-TiDB Lightning

    1 TiDB Lightning介绍 TiDB Lightning 是一个将全量数据高速导入到 TiDB 集群的工具,目前支持 Mydumper 或 CSV 输出格式的数据源。你可以在以下两种场景下使用 Lightning: 迅速导入大量新数据。 备份恢复所有数据。 TiDB Lightning 主要包含两个部分: (1)tidb-lightning(“前端”):主要完

    2024年02月13日
    浏览(66)
  • TiDB实战篇-TiDB Lightning 导入数据

    使用TiDB Lightning 导入数据。 它是使用物理导入的模式,将SQL文件直接导入到TiKV中,它是一种初始化的导入,也就是说目标的数据库和表都是不能够存在的(注意事项,在这种方式导入的时候TiKV要切换到导入模式才行) 。      先导入数据,然后在导入索性。   Logical Impo

    2024年02月04日
    浏览(44)
  • TIDB简介及TIDB部署、原理和使用介绍

    数据库分类 ​ 介绍TiDB数据库之前,先引入使用场景。如今的数据库种类繁多,RDBMS(关系型数据库)、NoSQL(Not Only SQL)、NewSQL,在数据库领域均有一席之地,可谓百家争鸣之势。那么我们为什么要学习使用TiDB呢?接下来就从我们最熟悉的MySQL的使用说起。 MySQL痛点 ​ 假设

    2023年04月20日
    浏览(32)
  • TiDB 源码编译之 PD/TiDB Dashboard 篇

    作者: ShawnYan 原文来源: https://tidb.net/blog/a16b1d46 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时

    2024年02月14日
    浏览(43)
  • BenchmarkSQL 支持 TiDB 驱动以及 tidb-loadbalance

    作者: GangShen 原文来源: https://tidb.net/blog/3c274180 TiDB-JDBC **是基于 MySQL 8.0.29 的定制版本。TiDB-JDBC 基于 MySQL 官方 8.0.29 版本编译,修复了原 JDBC 在 prepare 模式下多参数、多字段 EOF 的错误,并新增 TiCDC snapshot 自动维护和 SM3 认证插件等功能。 tidb-loadbalance 是应用端的负载均衡

    2024年02月14日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包