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

news2024/11/18 15:27:31

整体架构

在这里插入图片描述
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不丢失。

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

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

相关文章

python-16-线程池和进程池python并发编程

Python ThreadPoolExecutor线程池 线程池的基本原理是什么? 利用Python快速实现一个线程池,非常简单 Python并发编程专题 1 并发编程 1.1 并发编程概念 一、为什么要引入并发编程? 场景1:一个网络爬虫,按顺序爬取花…

在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制休眠(二)

问题场景 本月7月10日处理了一个虚拟机被强制暂停的问题,详见:在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制暂停当时是由于C盘存储空间不足,导致虚拟机被强制暂停,将虚拟机迁移后,问题…

哈工大计算机网络课程局域网详解之:交换机概念

哈工大计算机网络课程局域网详解之:交换机概念 文章目录 哈工大计算机网络课程局域网详解之:交换机概念以太网交换机(switch)交换机:多端口间同时传输交换机转发表:交换表交换机:自学习交换机互…

Spire.Office for.NET Crack

Spire.Office for.NET Crack Spire.Office for.NET是E-iceblue提供的企业级Office.NET API的组合。它包括Spire.Doc、Spire.XLS、Spire.Seadsheet、Spire.Presentation、Spire_PDF、Spire.DataExport、SpireOfficeViewer、Spire-PDFViewer、Spire.DocViewer、Spire.Barcode和Sp…

模板(简单介绍C++)

模板 引入模板函数模板概念语法函数模板的原理函数模板实列化隐式实例化显示实例化 模板参数匹配原则 类模板类模板的定义格式类模板的实列化 泛型编程补充知识 引入模板 当我们想实现一个通用的交换函数时,我们能否告诉编译器一个模子,让编译器根据不同…

基于Java+SpringBoot+vue前后端分离墙绘产品展示交易平台设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Ansible 自动化运维

目录 ansible 环境安装部署ansible 命令行模块inventory 主机清单 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可…

MySQL 之 Buffer Pool

一、innoDB设计缓冲池目的 避免频繁访问磁盘,提高数据库读写性能。(作用与引用Cache三级缓存类似。) 二、缓冲池工作模式 读取数据:当Buffer Pool存在目标数据,就直接返回给客户端,没有再磁盘取数据。 修改…

1-高性能计算研究

高性能计算研究 E级计算机系统研制高性能计算应用软件研发并行编程框架应用协同开发优化平台和工具软件示例 高性能计算环境研发 E级计算机系统研制 高性能互联计算、编程、运行模型 应用驱动的新型可扩展基础算法(适用于E级计算的可计算物理建模与新型计算方法&a…

softmax回归

模型 softmax回归是多类分类模型,用于获取每个分类的置信度,置信度计算方式如下 经过全连接层,得到输出O,将O作为softmax的输入 O是输出向量,每个分量表示一个类别,y_hat_i表示i类别的置信度&#xff0…

[语义分割] DeepLab v1网络(语义分割、信号下采样、空间上的不敏感性、LargeFOV、膨胀卷积、空洞卷积、MSc、Multi-Scale)

Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs 论文地址:Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs参考源码:https://github.com/TheLegendAli/DeepLab-Context DeepL…

数据库中的Hash索引以及哈希碰撞

hash索引,就是用过一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中 就比如下面的name字段,经过算法的分析,就会对应出一张hash表 如果我的两个name字段计算出来的key相同&a…

vscode eslint配置

1. 全局安装 eslint npm install -g eslint 2. control shift p 输入 settings 打开设置进行配置 3. 添加配置 {"workbench.colorTheme": "One Dark Pro","eslint.debug": true,"eslint.execArgv": null,"eslint.alwaysShow…

多表关联查询

十七、多表关联查询 但是开发中不会使用联合主键,还是只会使用一个主键 多表关联查询: 建表: 交叉连接 …… …… 重复时写清楚是哪个表的,不然会报错: 2、内连接 王妍没有部门,查不出来。此时需要用到外连…

Python 进阶(一):PyCharm 下载、安装和使用

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、下载 PyCharm二、安装 PyCharm三、创建项目四、界面汉化五、实用技巧5.1、使用快捷…

SpringMvc+Mybatis完整项目

0目录 1.SpringmybatisSpringmvc查询功能(记录数) 2.查询所有 3.增删改查(根据id) 4.增加用户注册登录功能 1.SpringmybatisSpringmvc增删改查 新建数据库 创建工程 配置web.xml 配置applicationContext.xml 实体类 My…

24考研数据结构-栈

目录 第三章 栈和队列3.1栈(stack)3.1.1栈的基本概念栈的基本概念知识回顾 3.1.2 栈的顺序存储上溢与下溢栈的顺序存储知识回顾 3.1.3栈的链式存储链栈的基本操作 第三章 栈和队列 3.1栈(stack) 3.1.1栈的基本概念 栈的定义 栈…

主流开源监控系统一览

减少故障有两个层面的意思,一个是做好常态预防,不让故障发生;另一个是如果故障发生,要能尽快止损,减少故障时长。而监控的典型作用,就是帮助我们发现及定位故障,这两个环节对于减少故障时长至关…

Docker挂载目录失败问题解决

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

SpringCloudAlibaba:服务网关之Gateway的cors跨域问题

目录 一:解决问题 二:什么是跨域 三:cors跨域是什么? 一:解决问题 遇到错误: 前端请求时报错 解决: 网关中添加配置文件,注意springboot版本,添加配置。 springboo…