《MySQL45讲》笔记—一条SQL查询语句是如何执行的、一条SQL更新语句是如何执行的

整体架构

在这里插入图片描述
server层包括连接器、查询缓存、分析器、优化器、执行器;存储引擎层负责数据的存储和提取,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎,如果在create table后面加一个“engine=”的话可以指定引擎,不然默认的是innodb。

查询语句执行

连接器

负责跟客户端建立连接、获取权限、维持和管理连接。

# -h 指定 MySQL 服务得 IP 地址,如果是连接本地的 MySQL服务,可以不用这个参数;
# -u 指定用户名,管理员角色名为 root;
# -p 指定密码,如果命令行中不填写密码(为了密码安全,建议不要在命令行写密码),就需要在交互对话里面输入密码
mysql -h$ip -u$user -p

一个用户成功建立连接之后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在的权限。修改完成之后,只有再新建的连接才会使用新的权限设置。
连接完成之后如果没有后续的动作,这个连接就处于空闲状态,客户端如果太长时间没有动静,连接器就会自动将他断开,这个事件是由wait_timeout控制的,默认值是8个小时。

长连接和短链接
  • 长连接:连接成功之后,如果客户端持续有请求,则一直使用同一个连接。
  • 短连接:每次执行完很少的几次查询就断开连接,下次查询重新建立一个。

尽量使用长连接,但是全部使用长连接,内存会涨的很快,然后OOM。可以定期断开长连接,或者执行mysql_reset_connection(MySQL5.7或者更新版本)来重新初始化连接资源,这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完的状态。

查询缓存

之前执行过的语句和结果有可能会以key-value的形式被直接缓存在内存中。但是不建议使用查询缓存。因为查询缓存失效非常频繁,除非你的业务就是一张静态表很久才会更新一次,比如一张系统配置表。MySQL8.0之后就没有查询缓存这个功能了。

分析器

  • 词法分析:识别里面的字符串是什么,代表什么
  • 语法分析:根据语法规则判断语法是否正确

优化器

决定使用哪个索引、决定各个表的连接顺序 。

执行器

  • 判断你对这个表有没有执行查询的权限
  • 打开表执行,执行器根据表的引擎定义去使用这个引擎提供的接口

举个例子:

 select * from T where ID=10;

表T中,如果ID字段没有索引,那么执行器的执行流程是这样的:
1、调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则
将这行存在结果集中;
2、 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
3、执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,这个语句就执行完成了。对于有索引的表,执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。

更新语句执行

创建一个表:

mysql> create table T(ID int primary key, c int);

如果要将ID=2这一行的值加1

mysql> update T set c=c+1 where ID=2;

首先,更新语句也会将查询语句的流程走一遍:

  • 连接器连接数据库
  • 查询缓存失效,这条语句将表T上所有缓存清空
  • 分析器通过词法分析和语法分析知道这是一条更新语句
  • 优化器决定使用ID这个索引
  • 执行器负责具体执行,找到这一行然后更新
    更新流程涉及两个日志模块redo log 和binlog。

redo log

WAL技术:Write-Ahead Loogin ,先写日志,再写磁盘。

有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log里面,并且更新内存,适当的时候,InnoDB会将这个操作记录更新到磁盘里面。redo log是固定大小的,如下图:
在这里插入图片描述

  • write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。
  • checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文
    件。
  • write pos和checkpoint之间的是还空着的部分,可以用来记录新的操作。
  • 如果write pos追上checkpoint,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。

crash-safe:有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失这也是为什么需要两份日志的原因,因为binlog没有这个能力。

binlog归档日志

redo log是InnoDB引擎特有的性质,server层也有自己的日志称为binlog.

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

执行器和InnoDB引擎执行更新语句的时候的内部流程

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

为什么需要两阶段提交?

  • 如果先写redo log后写binlog:如果binlog没有写完就crash了,binlog里面没有记录这个语句,所以之后备份日志的时候binlog就没有这个语句。
  • 先写binlog后写redo log ,redo log还没有写的时候就崩溃了,恢复之后,binlog就多出来了一个事务。

这样会导致数据库的状态和用它的日志恢复出来的库的状态不一致

  • redo log用于保证crash-safe能力。innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。建议设置成1,这样可以保证MySQL异常重启之后数据不丢失。
  • sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。建议设置成1,这样可以保证MySQL异常重启之后binlog不丢失。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CAXA中.exb或者.dwg文件保存为PDF

通常CAXAZ中的文件为.exb或者.dwg格式,我们想打印或者保存为PDF文件格式,那么就用一下的方法: CAXA文件如图所示: 框选出你要打印的图纸!!!! 我们选择"菜单"->"…

iptable防火墙

防火墙 防火墙的主要功能是隔离,决定数据是否可以被外网访问以及哪些数据可以进入内。 它主要部署在网络边缘或者主机边缘,应用在网络层。 防火墙的安全技术: 1、入侵检测系统:检测数威胁,病毒,木马,不…

下拉框可筛选可树状多选组件

实际效果图片 父页面 <el-form-item label"转发&#xff1a;" :label-width"formLabelWidth" class"formflex_item"><el-select ref"select" :clearable"true" clear"clearSelect" remove-tag"r…

UI设计工具都有哪些好用的推荐?

对于UI设计的初学者来说&#xff0c;掌握一个实用且易于使用的界面UI软件是非常重要的。今天&#xff0c;我整理了四个易于使用的界面UI软件。让我们看看。 即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打开即可使用&#xff0c;…

Kubernetes 的核心概念:Pod、Service 和 Namespace 解析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

HTML及其标签详解

文章目录 一、HTML简介1、网页1>什么是网页2>什么是HTML 2、Web标准1>为什么需要Web标准2>Web标准的构成 3、HTML语法规范1>基本语法2>标签关系 二、HTML标签1、基本标签2、标题标签3、段落和换行标签4、文本格式化标签5、< div>和< span>标签6、…

linux下的questasim安装和与vivado的关联

一、questasim安装 参考链接 IC验证工具&#xff1a;Ubuntu下Questasim10.7安装&#xff08;64bit&#xff09;全攻略 参考2 易特创芯 linux环境下questasim 10.7的安装总结_limanjihe的博客-CSDN博客 前面操作参照的第一个链接&#xff0c;后面激活文件参考的第二个 另外…

生成式人工智能新政策发布:AI进入规范时代!

最近&#xff0c;国家发布了《生成式人工智能服务管理暂行办法》。该条例于8月15日开始施行&#xff0c;使得AI应用进入规范化管理。该法明确了适用于提供生成文本、图片、音频、视频等内容的服务&#xff0c;鼓励人工智能技术在各行业、各领域的创新应用&#xff0c;生成积极健…

flask中redirect、url_for、endpoint介绍

flask中redirect、url_for、endpoint介绍 redirect 在 Flask 中&#xff0c;redirect() 是一个非常有用的函数&#xff0c;可以使服务器发送一个HTTP响应&#xff0c;指示客户端&#xff08;通常是浏览器&#xff09;自动导航到新的 URL。基本上&#xff0c;它是用来重定向用…

Java 设计模式——原型模式

目录 1.概述2.结构3.实现3.1.浅拷贝3.2.深拷贝3.2.1.通过对象序列化实现深拷贝&#xff08;推荐&#xff09;3.2.2.重写 clone() 方法来实现深拷贝 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;原型模式 (Prototype Pattern) 是一种创建型设计模式&#xff0c;是通过…

网页开发基础——HTML

一、flask框架 Flask是一种轻量级的Python web应用程序框架&#xff0c;可以帮助使用者快速构建Web应用程序和API。由于其简洁、灵活和易于上手的特点&#xff0c;Flask被广泛用于开发小型到中型的Web应用程序和后端API。本次我们主要是使用flask框架&#xff0c;进行一个小型w…

知网的caj格式怎么转化成pdf格式?两个方法简单快捷!

在使用知网等学术资源时&#xff0c;我们常常会遇到CAJ格式的文件&#xff0c;然而CAJ格式并不是常见的文件格式&#xff0c;给我们的查阅和分享带来一些不便。为了更方便地处理这些文件&#xff0c;我们可以将其转换为常见的PDF格式。在本文中&#xff0c;我将为您介绍两种简单…

超标量处理器寄存器rename

1.相关性介绍 在CPU中&#xff0c;一段程序会被编译成一连串的汇编指令&#xff0c;指令与指令之间可能会具有相关性&#xff08;dependency&#xff09;。所谓相关性&#xff0c;即一条指令的执行会依赖于另一条指令的结果&#xff0c;相关性可以分为&#xff1a;① 数据相关性…

Pycharm中如何设置在新窗口打开项目

settingAppearance&Behavior–System SettingsOpen project in - new window

年出货2亿台,只赚“辛苦钱”!又一家代工巨头押宝汽车电子

7月20日&#xff0c;作为国内ODM龙头之一的华勤技术正式启动招股&#xff0c;拟在上交所主板上市。此前&#xff0c;因技术先进性、科创属性不足等问题&#xff0c;该公司终止科创板IPO。 华勤技术成立于2005年&#xff0c;几年后赶上了全球智能手机的黄金时代&#xff0c;招股…

系统集成|第三章(笔记)

目录 第三章 系统集成专业技术3.1 信息系统建设3.1.1 信息系统3.1.2 信息系统集成 3.2 信息系统设计3.3 软件工程3.4 面向对象系统分析与设计3.5 软件架构3.5.1 软件的架构模式3.5.2 软件中间件 3.6 典型应用集成技术3.6.1 数据库与数据仓库技术3.6.2 Web Services 技术3.6.3 J…

3 Linux基础篇-VMware和Linux的安装

3 Linux基础篇-VMware和Linux的安装 文章目录 3 Linux基础篇-VMware和Linux的安装3.1 安装VMware和CentOS3.1.1 VM安装3.1.2 Centos7.6的安装步骤 3.3 虚拟机基本操作3.4 安装VMtools3.5 设置共享文件夹 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能…

无涯教程-jQuery - unbind()方法函数

unbind([type]&#xff0c;[fn])方法的作用与bind相反&#xff0c;它从每个匹配的元素中删除绑定事件。 unbind( [type], [fn] ) - 语法 selector.unbind( [type], [fn] ) 这是此方法使用的所有参数的描述- type - 一种或多种事件类型&#xff0c;以空格分隔。 fn …

rust学习-智能指针

适用场景 有一个在编译时未知大小的类型&#xff0c;想在需要确切大小的上下文使用该类型值 示例1 无意义的例子&#xff1a;将一个单独的值存放在堆上并不是很有意义&#xff0c;b更应该放到栈上 fn main() {let b Box::new(5);// box 在 main 的末尾离开作用域时&#x…

Visual Studio 2022 程序员必须知道高效调试手段与技巧(中)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 调试的时候查看程序当前信息&#x1f4ad; 查看临时变量的值&#x1f4ad; 查…