一条 SQL 语句是如何执行的

MySQL Sever - 一条SQL语句执行流程 MySQL Server - 一条SQL语句执行流程 阅读详情

1. select 语句执行过程

image-20221011144626201

一条 select 语句的执行过程如上图所示

1、建立连接

连接器会校验你输入的用户名和密码是否正确,如果错误会返回提示,如果正确,连接器会查询当前用户对于的权限。连接器的作用就是校验用户权限

2、查询缓存

MySQL 中有个缓存的概念,当你在执行一条 SQL 查询语句时,MySQL 会先去缓存中查看是否有对应的记录,如果有,则直接返回,如果没有,则取数据库中查询,查询完成后再放入缓存中。这个查询缓存的目的是为了加快 MySQL 查询速度。

这里建议你将这个缓存的选项关闭上,因为在实际项目中,这个查询缓存用处不大,为什么这么说。因为当有 update、或者 delete 语句执行时,这张的表查询缓存就会失效,下次查询还是需要从数据库中查询,所以通常来说查询缓存并不能提高性能。

3、分析器

分析器作用是进行词法分析,语法分析。对于 select 语句而言,MySQL 拿到这条 SQL 语句后,识别出 select 关键词,知道这是一条查询语句,然后再取识别 from 以及表名,识别字段,这个步骤是词法分析。词法分析完成后还需要进行语法分析,也就是判断这条语句的语法是否正确,比如你 select 写成了 selct,那么语法分析就会检验出来

4、优化器

优化器职责是对 sql 语句进行优化,比如这条语句该用什么索引,sql 顺序需不需要调整。

5、执行器

经过上面几部分析,就来到了执行器,开始从数据库查询数据了。查询数据前会校验一下有无权限该表的权限,如果没有则返回错误提示。有权限则开始扫描行,查看是否满足条件,满足条件的结果放入结果集中。

2. update 语句执行过程

update 语句执行过程和 select 语句相同,也需要经过连接、分析器、优化器、执行器这些步骤。不同的是,在 update 执行过程中涉及到两个日志,一个是 redo log,一个是 binlog

redo log

首先需要明确的是,redo log 是 Inndb 存储引擎独有的,其他引擎没有。redo log 主要作用是记账

举个通俗易懂的例子,你是掌柜的,开了一家店铺,店铺生意很好,每天都有很多人来,有些人都是常客,吃饭都是月结,于是你有一个账本,账本上记录了谁欠你多少钱,店铺刚开张时,客人少,你一笔笔记录,没问题,后来客人多了,你发现账本查找起来很费时,影响效率,于是你找了一个黑板,客人来了以后,消费了多少钱,你就记在黑板上,等到不忙的时候在汇总到账本上。

这里的黑板就是 redo log,账本就是 MySQL 数据库磁盘,这么做的原因是为了提高效率,不然 MySQL 每一次操作都要写入到磁盘中,效率很低,有了 redo log 以后,每次 update 操作,我只需要写到内存上,然后记录到 redo log 中即可返回,这样速度快了很多。等到空闲的时候,再将 redo log 中的数据写入到磁盘中进行持久化。

InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。

image-20221011154306520

write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

write pos 和 checkpoint 之间的是“粉板”上还空着的部分,可以用来记录新的操作。如果 write pos 追上 checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。

有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

要理解 crash-safe 这个概念,可以想想我们前面赊账记录的例子。只要赊账记录记在了粉板上或写在了账本上,之后即使掌柜忘记了,比如突然停业几天,恢复生意后依然可以通过账本和粉板上的数据明确赊账账目。

binlog

上面说的 redo log 是引擎层的日志,那么 binlog 则是 MySQL Server 层的日志

binlog 主要是记录 MySQL 的原始操作语句,比如 update user set name = "张三" where id = 2,binlog 就将它记录下来

binlog 和 redolog 区别

  • redolog 是引擎层面的日志,是 Inndb 独有的,binlog 是 Server 层的,所有引擎都可以使用
  • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
  • redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

两阶段提交

update 语句执行的内部流程

update user set name = "张三" where id = 2

  1. 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
  2. 执行器拿到引擎给的行数据,把这个值修改成张三
  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
  4. 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

两阶段提交就是先提交 redolog,然后写入 binlog,binlog 写入成功后再提交 redolog

MySQL深入】一条SQL查询语句执行过程 1.MySQL基本架构示意图 MySQL可以分为Server层和存储引擎层两部分 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。 2.连接器 定义:负责跟客户端建立连接、获取权限、维持和管理连接。mysql -h 阅读详情

相关推荐

RV1106G3的AOV下的yolov5调试记录

本文介绍了基于LuckFoxPicoMax开发板的RV1106芯片调试经验,重点包括AOV(Always-On Vision)和Yolov5目标检测的实现。在硬件方面,板载1TOPS NPU、256MB内存,并更换为SPI NOR存储。软件调试涉及MK配置文件修改、设备树调整(按键唤醒和sensor配置)以及程序自启动设置。Yolov5模型优化为320*320尺寸,推理时间约45ms。系统采用VI采图与AI识别通过共享内存通信的方案,实测功耗在20-35mA范围。文章还指出了当前存在的功耗优化、ISP调试等

fzktongyong的博客 1654

一条SQL执行过程是怎样的

需要注意的是,查询缓存在一些场景下可能不太适用,因为它有一定的缺陷和开销。MySQL 8.0 版本开始,默认情况下查询缓存已被废弃。因此,在实际应用中,需要权衡是否使用查询缓存。

越努力越幸运。 1044

详解一条SQL语句执行过程

SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上。同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL语句的底层实现不同罢了,但结果相同。 一般情况下,大部分SQL语句在不同的数据库上是通用的,但我们知道每个数据库都有自己独有的特性,像在MySql数据库中,可以使用substr(取字符串),trim(...

数字成都 2万+

一条sql是如何执行的详解

SQL 查询的执行过程分为解析、查询重写、查询规划、查询执行和结果返回五个主要步骤。每个步骤都对应特定的任务,从解析 SQL 到最终返回结果,确保查询尽可能高效地执行听忆.-CSDN博客🎈众口难调🎈从心就好。

边走、边悟、迟早变好 3408

一条SQL执行是如何执行的?它的执行流程是什么?跟我一起探索吧!

一条SQL执行是如何执行的?它的执行流程是什么?跟我一起探索吧!

我是Java程序员廖志伟,感谢朋友们的支持! 1247

sql执行流程概述

sql执行流程 一、sql执行流程概述 作为编程的基础,少不了和数据库打交道。一般都知道sql的基本语法,包括表查询、删除、插入、创建等语句的使用,那么从sql脚本到最终返回结果,这中间有哪些流程呢?本着好奇心,了解一下sql执行流程。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o2xACMix-1649771275646)(01.png)] 根据上图,简要描述一下sql执行流程: 1、在打开客户端后,最初需要和sql服务器建立连接,账号认证和校验权限。 2、认证后,客户

qq_41116027的博客 1万+

详解Mysql一条sql语句执行过程

详解MYSQLSQL语句执行过程

m0_66220639的博客 1830

MySQL一条SQL语句执行过程

MySQL一条SQL语句执行过程涉及多个组件,包括连接器、查询缓存、解析器、预处理器、优化器、执行器和存储引擎。理解这些组件的工作原理,对于性能优化、故障排查和安全加固至关重要。通过本文的讲解,希望你能够更深入地理解MySQL的内部机制,并在实际工作中应用这些知识,提升数据库操作的效率和安全性。如果你有任何问题或需要进一步的帮助,请在评论区留言,我会尽力为你解答。

xycxycooo的博客 879

一条SQL语句是如何执行的,你真的知道吗?

让你了解SQL语句真正执行的秘密!😀

qq_56158663的博客 2037

Mysql一条sql语句执行过程是怎样的?

MySQL执行SQL语句过程分为连接层、SQL处理层和存储引擎层:1)连接层验证权限建立通信;2)SQL处理层通过解析器、优化器生成执行计划;3)存储引擎层(如InnoDB)通过缓冲池和索引访问数据。关键优化点包括合理使用索引、控制事务大小和配置内存参数。全流程涉及语法解析、成本优化、数据读写等环节,性能瓶颈常出现在全表扫描、锁竞争和缓冲池不足等情况。

学习Java技术栈 1030

一条 SQL 语句是如何执行的?

一条 SQL 语句是如何执行的? 首发于 GitHub 开源项目: Java超神之路 整理好的 Java 技术栈全套学习资料,欢迎 star! ​ 你好,我是杜少雄。 ​ 今天和大家聊一聊 MySQL 的基础架构。我们经常说,看一个事千万不要直接陷入细节里。应该先鸟瞰全貌。这样能够帮助你从高维度理解问题。当一条 SQL 语句执行的时候,我们看到的是最后的执行结果。却不知道这条语句MySQL 内部是如何执行的。 总览 ​ 所以今天我们把 MySQL 拆解一下,看看里边有哪些零件。下边

m0_70565884的博客 532

MySQL 一条 SQL 语句的完整执行过程详解

MySQL SQL语句执行过程详解:从客户端请求到结果返回,经历驱动连接、服务器线程处理、SQL解析、优化器生成执行计划、执行器调用存储引擎接口等阶段。InnoDB引擎通过Buffer Pool缓存数据,结合undo/redo日志实现事务特性,并与binlog协作确保数据一致性。关键优化点包括连接池配置、SQL编写规范、索引使用和事务控制。了解完整流程有助于编写高效SQL和性能调优。

weixin_39956506的博客 779

一条sql语句究竟是如何执行

MySQL server层逻辑架构从上往下可以分为三层:(1)第一层:处理客户端连接、授权认证等。(2)第二层:服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现、存储过程等。(3)第三层:存储引擎,负责MySQL中数据的存储和提取。MySQL中服务器层不管理事务,事务是由存储引擎实现的。MySQL支持事务的存储引擎有InnoDB、NDB Cluster等,其中InnoDB的使用最为广泛;其他存储引擎不支持事务,如MyIsam、Memory等。

m0_69632475的博客 704

MySQL#秘籍#一条SQL语句执行时间以及资源分析

MySQL Profiling可以帮助分析SQL语句执行耗时及资源消耗情况。具体使用步骤:1) 执行SET profiling = 1开启分析;2) 执行待测SQL;3) 使用show profiles查看所有记录,show profile查看最近一条SQL详情,或show profile for query id查看指定SQL。还可指定分析类型如CPU、IO等资源消耗。注意事项:数据依赖系统调用,部分系统可能返回NULL;统计信息是进程级别且动态变化的。通过Profiling可以清晰了解SQL执行各阶段耗

每天进步一小步 825

Mysql——一条SQL语句执行流程

一条sql语句执行流程

weixin_43891057的博客 966

一条SQL语句是如何执行的?

大家六一儿童节好呀! 接下来的一段时间内,将带领大家一同探索MySQL的奥妙,加油吧!我们。 下面进入正题:一条SQL语句是如何进行的? 对于这个问题,我想将其分为两个问题来回答,分别是: 一条查询SQL是如何执行的? 一条更新SQL是如何执行的? 我们都知道MySQL内部是分为Server层和存储引擎层的;每个层都有各自的职责; 对于一个查询语句,eg:select * f...

飞翔的博客 3553

SQLMysql一条sql语句执行过程

假设写完 redo log 后,机器挂了,binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。然后拿到查询的语句,把 age 改为 19,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。

double222222的博客 3288

MyBatis是如何执行一条SQL语句

在前两天的一次面试中,面试官问了一个和标题一样的问题,由于一直认为MyBatis只是一个ORM框架,所以并没有对他有过深入的了解,于是被问到了,那么这一篇文章来从源码探究一下MyBatis是如何执行一条SQL语句的。...

m0_48922996的博客 268

【微服务】SpringBoot 对接飞书审批流程使用详解

SpringBoot 对接飞书审批流程使用详解

congge_study的博客 3713

工具变量-分省年平均气温数据(1949-2023年).xlsx

详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/149495988

上一篇: 博客园图片无法显示
下一篇: 这次彻底读透 Redis
说故事的五公子
博客等级 码龄9年 34粉丝 110原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值