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

news2024/12/25 9:12:33

一 DML语句读写流程

1 DML语句读流程概要

 

用户发出SQL

被协议层接收 Protocal Layer

通过PD获取时间戳 

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

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

2  DML语句读流程概要

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

二 DDL语句的执行流程

在集群中有多个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

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

读取的执行

 有了执行计划之后 读取的流程 主要设计的模块 在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中读数据了。

 

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 支持 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 。

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

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

相关文章

【尚硅谷】索引优化分析

目录 1. 常用指令查使用引擎的指令 sql 优化合并去重分页显示模糊查询 索引优化单表优化两表优化 1. 常用指令 常用指令: 查询日志:默认关闭,记录查询的sql语句(比如慢查询,大于多少秒的都记录)&#xff0…

Linux共享库库+例子

1.什么是共享库?有什么优点?和静态库有什么区别? Linux动态库(Dynamic Link Library,缩写为DLL)是一种在Linux系统中使用的共享库(Shared Library)。与静态库不同,动态库…

船舶推进系统故障诊断(Python代码,多通道信息融合)

1.代码运行环境要求:TensorFlow版本>2.4.0,python版本>3.6.0 船舶推进系统是船舶的重要组成部分,其功能是提供动力以推动船舶前进。故障可能由多种因素引起,以下是船舶推进系统常见的故障类型: 发动机故障&…

k8s部署新版elasticsearch+kibana并配置快照备份

版本:es 7.17.6 kibana 7.17.6 k8s:1.19.16 一、介绍 Elasticsearch和Kibana是一对强大的开源工具,通常一起使用以构建实时数据分析和可视化解决方案。 Elasticsearch: Elasticsearch是一个分布式、高性能的实时搜索和分析引擎。它构建在开源搜索引擎库Lucene之上…

Java基础阶段学习哪些知识内容?

Java是一种面向对象的编程语言,刚接触Java的人可能会感觉比较抽象,不要着急可以先从概念知识入手,先了解Java,再吃透Java,本节先来了解下Java的基础语法知识。 对象:对象是类的一个实例,有状态…

2023.07.26【微生物】|qiime2组间分析,ANCOM算法介绍与结果解读

目录 摘要ANCOM简介主要步骤数据聚合添加伪计数计算特征差异 结果解读火山图差异显著特征统计表差异显著特征百分位数统计表优缺点 总结 摘要 在使用qiime2进行16S/ITS分析的时候,少不了对样品进行组间分析。除了常见的PicRust和Lefse分析之外,qiime2自…

web前端tips:js继承——借用构造函数继承

上篇文章给大家分享了 js继承中的原型链继承 web前端tips:js继承——原型链继承 在文章末尾,我提到了 原型链的继承,子类需要传递参数给父类的构造函数,就无法通过直接调用父类的构造函数来实现,需要通过中间的过程来…

分享5款有点冷门的实用派软件

​ 分享5款冷门但值得下载的Windows软件,个个都是实用,你可能一个都没见过,但是 我觉得你用过之后可能就再也离不开了。 系统监控——XMeters ​ XMeters是一个系统监控软件,可以让你在任务栏上显示各种系统信息,如C…

(十九)使用InfluxDB搭建报警系统

以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦! 第 19 章 使用InfluxDB搭建报警系统 19.1 什么是监控 1、监控其实每隔一段时间对数据计算一下。比如&#xf…

SAS-数据集添加序号

一、数据集添加序号 方法1:data步生成 方法2:proc sql生成 /** 方法1 **/ data class1; set sashelp.class; seq _N_; /** 添加序号 **/ run; /** 方法2 **/ proc sql;create table class2 as select monotonic() as id, * /** monotonic()添加id **…

航空发动机支架质量检测非接触式全尺寸测量CASAIM 3D扫描仪

发动机是实现飞行的强大“心脏”支撑,发动机支架是飞机这一精密而复杂系统中不可或缺的一部分,它将巨大而沉重的发动机牢固安装在飞机上,使其可以承受各种飞行载荷和各种未知的挑战,因此航空发动机支架的质量检测和尺寸测量至关重要。 使用CASAIM 3D扫描…

【java实习评审】对小说详情模块的服务封装比较到位

大家好,本篇文章分享一下【校招VIP】免费商业项目“推推”第一期书籍详情模块java同学的代码作品。该同学来自成都信息工程大学。本项目亮点难点:1 热门书籍在更新点的访问压力,2 书籍更新通知的及时性和有效性,3 书荒:同好推荐的…

文档翻译软件那么多,哪个能满足你的多语言需求?

想象一下,你手中拿着一份外文文件,上面记录着珍贵的知识和信息,但是语言的障碍让你无法领略其中的内容。而此时,一位翻译大师闪亮登场!他的翻译技巧犹如一把魔法笔,能够将文字的魅力和意境完美传递。无论是…

OpenShift 4 - 为 OpenShift 托管集群配置用户认证(视频)

《OpenShift / RHEL / DevSecOps / Ansible 汇总目录》 说明:本文已经在 OpenShift 4.13 ACM 2.8 AWS 环境中验证 本文是《OpenShift 4 - 用 HyperShift 实现以“托管集群”方式部署运行 OpenShift 集群(视频)》的后续。 文章目录 托管集群…

【vue3】vue3的一般项目结构、成功显示自己的vue3页面

一、vue3的一般项目结构 Vue 3并没有规定特定的项目结构,因此您可以根据项目的需求和个人偏好来组织您的Vue 3项目。以下是一个常见的Vue 3项目结构示例,供参考: your-project/|- public/| |- index.html # 应用程序的入口HTML文件…

项目里程碑有什么作用?设置里程碑时应注意什么?

正如 "里程碑 "一词的原意是表示所走距离的标记,项目中的里程碑也代表着迄今为止已完成的任务或活动。但实际上,里程碑的作用远不止于此。 项目里程碑为何重要? 项目的成功取决于细节。项目里程碑之所以重要,是因为它…

会不会好奇ai绘画生成器?ai创作的灵感从何而来?

在这个宁静的公园里,阳光透过树叶的缝隙洒在的地面上,微风轻拂着艺术家的发丝,带来一丝清凉。坐在长椅上的他,手中紧握着一支触控画笔,目光凝视着眼前的美景。旁边一台智能绘画助手正在悄悄发光,它似乎能够…

99%误报与1%真实告警之间,差一个“威胁情报”

在网络安全领域,平均检测时间(MTTD)与平均响应时间(MTTR)是衡量企业应对威胁事件能力的重要指标。根据 SANS 2019 事件响应的调查,52.6%的企业平均检测时间少于24小时。一旦检测到事件,67%的企业…

陪诊小程序定制|医院陪诊系统源码|陪诊小程序开发

随着人们对健康关注的日益增加,陪诊服务的需求也在不断增长。为了提供便捷、高效的陪诊服务,陪诊小程序应运而生。下面将介绍一些陪诊小程序开发的优势。   便捷的预约与安排   陪诊小程序提供了便捷的预约与安排功能。用户可以通过小程序随时随地进…