加入收藏 | 设为首页 | 会员中心 | 我要投稿 成都站长网 (https://www.028zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL 内核原理分析(一)

发布时间:2022-09-30 15:00:45 所属栏目:MySql教程 来源:未知
导读: Java系统的 数据库连接池 我们的系统如果每个线程访问数据库时,都创建一个连接,然后销毁,会怎样 所以,我们要使用数据库连接池 MySQL 的 连接器 MySQL 连接器的功能

Java系统的 数据库连接池 我们的系统如果每个线程访问数据库时,都创建一个连接,然后销毁,会怎样 所以,我们要使用数据库连接池 MySQL 的 连接器 MySQL 连接器的功能 连接成功后,如果没有后续动作,这个连接会处于空闲状态空闲一定时间后,会自动断开连接,由参数 wait_timeout 控制的,默认值是 8 小时

我们现在已经知道,我们执行SQL,一定要先连接到数据库。数据库的 连接器 会对系统进行权限认证,如果认证成功,就创建了一个数据库连接。那么,连接之后是怎么执行SQL语句的呢?一个基本的知识点,网络连接必须要分配给一个线程去处理 线程获取到了我们写好的SQL语句,那交给谁来执行呢 如果在缓存中找到 key,那么这个 value 就会被直接返回给客户端但是,建议不要使用缓存,往往弊大于利 MySQL 8.0 版本直接将查询缓存的整块功能删掉了 没有了查询缓存这个功能,我们写好的SQL,都是交给查询解析器来分析的

在这里插入图片描述

解析器 语法解析器 会将 上面的SQL拆解为几部分 如果语法不对,解析器会提示我们 优化器 这个我们后面会仔细分析,这里知道它会选一个最优路径就好。先了解MySQL的整体架构,再深究细节

在这里插入图片描述

执行器 接下来,我们来研究一下mysql内核,存储引擎的架构设计,以及如何基于存储引擎来完成一条更新语句的执行。MySQL 有多种存储引擎,InnoDB、MyISAM等,我们就说最常用的InnoDB。接下来的图,我就只画 InnoDB 存储引擎这部分的了,连接、解释器、优化器会去掉,不然画不下了。我们以一条更新操作来看一下 InnoDB 的运行流程用这个SQL举例: InnoDB 中 重要的内存结构 Buffer Pool Buffer Pool 中的数据是缓存页,磁盘中的表数据是数据页,内部有其数据结构。我们这里忽略,先看一下整体的运行流程,之后再分析里面的物理结构。undo 日志文件 如果数据回滚,就会从 undo 日志文件中读取原始数据恢复 备注:InnoDB 是个存储引擎,步骤2 其实也是我们上面说到的 执行器 来把原始数据写到磁盘上的,后面的步骤,但凡有写磁盘、读磁盘的操作,都是执行器执行的。这里为了画图方便,直接连线了

在这里插入图片描述

然后 执行器 会更新 Buffer Pool 中的缓存数据

在这里插入图片描述

现在,缓存内的数据已经从 张三 更新到 李四 了 我们在内存中修改的数据,终究要刷到磁盘上的。MySQL 不会马上把这条数据刷到磁盘上,会等系统不忙碌时,再刷回去。因为刷磁盘这事,本来实时性要就不高,我们查询的时候也是基于内存的,磁盘是什么数据无所谓,只要保证最终一致就好了。我们只有提交事务后,才能把内存修改的数据刷到磁盘上提交事务是一个过程,这个过程中我们需要先写入几份日志文件,只有这几个日志文件都写成功了,事务才算提交成功所以,这里开始介绍 InnoDB 存储引擎中的另一个组件 Redo log Buffer 之前,我们已经修改了内存数据,在修改完成后,执行器就会向Redo log Buffer 中写入日志,到这一步为止,我们已经执行完了这条SQL语句,就差提交事务如果我们提交事务,第一步就是把 Redo log Buffer 中的日志刷到磁盘上的 redo log 中 redo log 日志是 偏物理层面的日志,也叫 重做日志。而 binlog 是归档日志(这个后面说) 把 redo log 从内存刷到磁盘的策略有三种 值为 1 :提交事务后立刻把日志刷到磁盘,只要提交事务成功,那 redo log 一定在磁盘值为 2 :提交事务后会把 redo log 先刷到 os cache(操作系统缓存) 里 ,然后 os cache 在适当的时机刷入磁盘 我们平时开发还是要用 innodb_flush_log_at_trx_commit = 1 ,立刻刷磁盘。保证提交事务后,数据绝对不会丢失 redo log 是偏物理层面的日志。如果发生数据库操作失误,我们不能根据这个来恢复数据。我们需要用 binlog 来恢复,binlog 是偏逻辑性的日志binlog binlog 不是 InnoDB 存储引擎特有的日志文件,是属于 MySQL Server 自己的日志文件我们开始提交事务,第一步是把 redo log 日志刷到磁盘, 接下来执行器还要继续写 binlog 日志到磁盘binlog 刷磁盘有两种策略,通过 sync_binlog 参数来配置,默认值 0 值为 1 :直接刷到 磁盘文件中 ,是要提交事务成功,数据一定不会丢失

在这里插入图片描述

最后,是 事务提交的最后一步 为什么要在 redo log 中写入 commit 标记呢? 现在,本条更新语句已经提交了事务,更新完毕了 然后,是最后一个步骤 到现在,我们已经知道了 MySQL 的整体运行流程,和内部的运行原理,MySQL 的全貌我们已经看见了。我们在脑海中要有下面这张图

在这里插入图片描述

接下来,我们重点研究每个组件的底层原理,深入的分析里面的细节

(编辑:成都站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!