当前位置: 首页 > news >正文

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

一 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 。

相关文章:

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

一 DML语句读写流程 1 DML语句读流程概要 用户发出SQL 被协议层接收 Protocal Layer 通过PD获取时间戳 parse模块 解析SQL,通过词法解析 与 语法解析 生成AST语法树 编译SQL Compile模块 ,区分点查 与 非点查,生成执行计划 发送给Executor,从TIKV获…...

微服务——服务异步通讯RabbitMQ

前置文章 消息队列——RabbitMQ基本概念容器化部署和简单工作模式程序_北岭山脚鼠鼠的博客-CSDN博客 消息队列——rabbitmq的不同工作模式_北岭山脚鼠鼠的博客-CSDN博客 消息队列——spring和springboot整合rabbitmq_北岭山脚鼠鼠的博客-CSDN博客 目录 Work queues 工作队列…...

事件冒泡、事件捕获和事件委托

原文合集地址如下,有需要的朋友可以关注 本文地址 合集地址 什么是事件冒泡、事件捕获和事件委托? 事件冒泡(Event Bubbling)、事件捕获(Event Capturing)和事件委托(Event Delegation&…...

WEB 典型安全功能说明

WEB 典型安全功能 认证Authentication 认证是指通过验证用户的身份来确认用户是否有权访问某个系统或资源。在Web安全中,认证是非常重要的一环,它可以防止未经授权的访问,保护用户的数据和系统的安全。 登录 登录是用户认证的常见方式之一…...

SQL编译优化原理

最近在团队的OLAP引擎上做了一些SQL编译优化的工作,整理到了语雀上,也顺便发在博客上了。SQL编译优化理论并不复杂,只需要掌握一些关系代数的基础就比较好理解;比较困难的在于reorder算法部分。 文章目录 基础概念关系代数等价 j…...

qt signal slots lambda

这里用到了qt的版本检测 连接 Combox的currentIndexChanged事件 emit来触发处理的事件 ,进行业务或逻辑处理 这样的写法是lambda表达式的写法,和c#中的 (obj)>{ //todo } 类同 [](int indx){ //todo } #if QT_VERSION > QT_VERSION_CHECK(5,7,0)c…...

Spring【声明式事务】

事务简介 把一组业务当成一个业务来做;要么都成功,要么都失败!事务在项目开发中,十分重要,涉及到数据一致性的问题,需要十分注意!确保完整性和一致性! 事务的ACID原则:…...

【雕爷学编程】MicroPython动手做(17)——掌控板之触摸引脚2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...

pytorch 中 view 和reshape的区别

在 PyTorch(一个流行的深度学习框架)中, reshape 和 view 都是用于改变张量(tensor)形状的方法,但它们在实现方式和使用上有一些区别。下面是它们之间的主要区别: 实现方式: reshap…...

认识数组指针

文章目录 数组指针的定义数组指针的应用 数组指针的定义 类比 整形数组——存放整形的数组 指针数组——存放指针的数组 整形指针——存放整形地址的指针 数组指针——存放数组地址的指针 深度理解 在之前我们知道:数组名表示首元素地址,但是有&#xf…...

SSM面试题-Spring容器的启动流程

解答: 1. BeanDefinitionReader读取配置文件(xml yml properties),创建BeanDefinition(存储bean的定义信息) 2. 配置文件读取成功后,将相应的配置转换成 BeanDefinition 的对象实例保存在DefaultListableBeanFactory#beanDefinitionMap 中 3. 根据配置的 BeanFacto…...

Vue 3:玩一下web前端技术(八)

前言 本章内容为VUE基础与相关技术讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(七)_Lion King的博客-CSDN博客 下一篇文章地址: (暂无) 一、基础 官方文档:创建一个 Vue…...

AI绘画Stable Diffusion原理之Autoencoder-Latent

前言 传送门: stable diffusion:Git|论文 stable-diffusion-webui:Git Google Colab Notebook:Git kaggle Notebook:Git 今年AIGC实在是太火了,让人大呼许多职业即将消失,比如既能帮…...

C++核心知识点总结

学习一门新的程序设计语言得到最好方法就是练习编写程序! C基础 变量和基本类型 基本内置类型 定义解释 算术类型 整型:包括字符和布尔类型,bool、char、wchar_t、char16_t、char32_t、short、int、long、long long、 浮点型:…...

echart折线图,调节折线点和y轴的间距(亲测可用)

options代码: options {tooltip: {trigger: axis, //坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。},xAxis: {type: category,//类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。…...

Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)

ODBC数据源 一些小众的数据源无法直接连接,需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序,Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…...

redis 淘汰策略和持久化

文章目录 一、淘汰策略1.1 背景1.2 淘汰策略 二、持久化2.1 AOF日志2.1.1 AOF配置2.1.2 AOF策略2.1.3 AOF缺点2.1.4 AOF Rewrite2.1.5 AOF Rewrite配置2.1.6 AOF Rewrite缺点2.1.7 fork进程时的写时复制2.1.8 大key对持久化的影响 2.2 RDB快照2.2.1 RDB配置2.2.2 RDB缺点 2.3 混…...

Redis学习路线(6)—— Redis的分布式锁

一、分布式锁的模型 (一)悲观锁: 认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。例如Synchronized、Lock都属于悲观锁。 优点: 简单粗暴缺点: 性能略低 &#x…...

一、创建自己的docker python容器环境;支持新增python包并更新容器;离线打包、加载image

1、创建自己的docker python容器环境 参考:https://blog.csdn.net/weixin_42357472/article/details/118991485 首先写Dockfile,注意不要有txt等后缀 Dockfile # 使用 Python 3.9 镜像作为基础 FROM python:3.9# 设置工作目录 WORKDIR /app# 复制当前…...

【Git】git企业开发命令整理,以及注意点

1.git企业开发过程 业务的分支大概有以下几个: master:代码随时可能上线 develop:代码最新 feature/xxx:实际业务开发分支 release/xxx:预发布分支 fix:修复bug分支 过程大概是这样的: 首…...

PDF补丁丁完全指南:免费开源PDF工具箱的7个高效使用技巧

PDF补丁丁完全指南:免费开源PDF工具箱的7个高效使用技巧 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: https://…...

告别移植烦恼:用STM32CubeMX和ENV工具5分钟搞定RT-Thread BSP适配(以STM32F103ZE为例)

5分钟极速适配RT-Thread:STM32CubeMX与ENV工具链实战指南 当拿到一块全新的STM32开发板时,许多嵌入式开发者都会面临相同的困境:如何在最短时间内验证RT-Thread实时操作系统的运行?传统手动移植BSP的方式往往需要数小时甚至更长时…...

Lindy HR自动化上线72小时后,员工自助率飙升83%:我们如何用1套规则引擎替代3个外包团队

更多请点击: https://intelliparadigm.com 第一章:Lindy人力资源自动化方案的诞生背景与核心价值 在数字化转型加速推进的今天,中大型企业普遍面临HR事务重复率高、跨系统数据割裂、员工自助能力薄弱等结构性挑战。传统HRIS平台虽能承载基础…...

杰理之ota_修复edr升级数组越界问题【篇】

...

通过taotoken cli工具一键配置多开发环境下的api密钥与端点

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过taotoken cli工具一键配置多开发环境下的api密钥与端点 在团队协作或个人多项目开发中,管理不同大模型服务的API密…...

ASP.NET Core 分层设计实践拒绝胖Controller

Controller 是 API 的入口,理论上应该只做三件事:接收请求、调用下层、返回响应。但在实际项目中,不少开发者会把用户校验、金额判断、业务限制条件直接写进 Controller Action,久而久之就成了所谓的"胖 Controller"。 这不只是代码整洁的问题。业务规则一旦耦合…...

华硕笔记本性能优化终极指南:三步搞定轻量级控制神器GHelper

华硕笔记本性能优化终极指南:三步搞定轻量级控制神器GHelper 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbo…...

安卓HTTPS抓包证书信任问题深度解析与系统级迁移方案

1. 为什么安卓抓包总在“证书信任”这关卡住?——一个被低估的系统级权限问题你是不是也经历过:Fiddler、Charles 或 mitmproxy 在电脑上配置得严丝合缝,手机 Wi-Fi 代理一设就通,HTTP 流量哗哗跑,可一到 HTTPS&#x…...

AlphaDev:用强化学习在汇编层发现最短正确排序程序

1. 项目概述:当AI开始重写计算机科学的“圣经” “AlphaDev:Sorting Algorithm ‘Hold My Beer’”——这个标题刚在2023年5月登上《Nature》封面时,我正在给一群刚学完冒泡排序的大二学生讲算法课。下课后有个学生举手问:“老师&…...

终极ncmdump工具完整指南:3分钟快速解密NCM格式音乐文件

终极ncmdump工具完整指南:3分钟快速解密NCM格式音乐文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的歌曲只能在特定播放器里播放而烦恼吗?ncmdump工具为你提供完美的解决方案&…...