返回顶部
首页 > 资讯 > 数据库 >MySQL InnoDB架构的相关总结
  • 301
分享到

MySQL InnoDB架构的相关总结

MySQLInnoDBMySQLInnoDB架构 2022-05-28 00:05:31 301人浏览 薄情痞子
摘要

目录引言1、Mysql数据库整体架构sql接口解析器优化器执行器存储引擎2、InnoDB存储引擎架构内存缓冲池undo log日志文件redolog日志文件binlog日志文件InnoDB执行流程引言 作为一个后端

目录
  • 引言
  • 1、Mysql数据库整体架构
    • sql接口
    • 解析器
    • 优化
    • 执行器
    • 存储引擎
  • 2、InnoDB存储引擎架构
    • 内存缓冲池
    • undo log日志文件
    • redolog日志文件
    • binlog日志文件
    • InnoDB执行流程

引言

作为一个后端程序员,我们几乎每天都要和数据库打交道,市面上的数据库有很多,比如:mysqloracle,SqlServer等等,那么我们的写的程序是怎么和数据库连接起来的呢?那就是数据库驱动,不同的数据库对应了不同的数据库驱动。在我们连接数据库的时候,首先将数据库驱动进行注册,然后基于数据库地址,用户名,密码等信息与数据库建立连接。如果用Maven来管理项目的话,一般会看到如下配置:


<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.24</version>
</dependency>

如上,通过maven导MySQL的驱动jar包,接着就可以在项目中通过sql语句操作数据库了。那数据库在接收到请求后,是怎么执行的呢?接下来我将通过MySQL数据库进行详细阐述。

1、Mysql数据库整体架构

一般我们知道,WEB项目开发完以后,可以将项目文件打成一个war包,然后通过Tomcat容器进行发布,最后用户就可以访问我们的系统了。我们都知道,Tomcat是支持并发访问的,当多个请求需要同时操作数据库的时候,难道是多个请求去抢占一个数据库连接吗?那肯定不是的,不然效率得多低下,那难道是给每个请求都建立一个连接,请求结束后再销毁连接吗?那肯定也不是的,频繁建立、销毁连接肯定也是影响性能的。那Tomcat是如何解决这个问题的呢? 还记得我们在讲线程池的时候提到的“池化”思想吗?是的,Tomcat中有一个数据库连接池,那么同样的数据库服务器中也有一个对应的数据库连接池,大致结构如下图所示

SQL接口

当请求到达数据库以后,会被监听的线程发现,继而将请求转交给SQL接口来处理,SQL接口专门用于执行增删改查这样的SQL语句。

解析器

虽然SQL语句我们比较容易理解,但是对于MySQL系统来说是没法直接理解的,所以SQL接口会把SQL语句转交给解析器,查询解析器负责将SQL语句进行解析,也就是按照既定的SQL语法,对SQL语句进行解析,理解这个SQL要完成的操作。

优化器

当解析器理解了SQL语句需要完成的操作后,接着通过优化器选择一条它认为的最优路径。一般情况下,要达到某种结果并不是只有一条路径,比如,要查询在表T里,符合条件C的两个字段f1,f2的值,至少可以有以下两种路径:

  1. 先去表T中筛选出符合条件C的所有数据行,再选出字段f1,f2的值作为结果集;
  2. 先选出所有f1,f2的值,再根据条件C筛选出符合条件的数据行组成结果集。

优化器会根据不同的策略得到它认为最优的查询路径。

执行器

当优化器选出最优的查询路径后,并不能得到我们最终希望得到的结果,所以还需要用执行器。执行器的作用就是根据优化器选出的最优查询路径生成一套执行计划,然后不停的去调用数据库存储引擎提供的接口去完成SQL语句的执行计划。

存储引擎

数据库一般将数据无非存储在两个地方:内存或磁盘。那么假如我们查询数据时,执行器需要到去磁盘还是内存中查询呢?内存中是如何查询的?磁盘中是如何查询的,内存的容量是有限的,当内存中没有多余的空间怎么办?等等一系列问题的解决方案就是存储引擎,MySQL提供了多种存储引擎:InnoDB,MyISAM,MEMORY等等,比较常见的是InnoDB和MyISAM,可以通过show engines命令查看当前MySQL数据库的存储引擎。本系列将主要分析InnoDB存储引擎。

综上,一套完整的SQL语句执行流程如下图所示

2、InnoDB存储引擎架构

假如现在一条SQL语句通过上述的流程,到了执行器调用InnoDB存储引擎的接口,那么InnoDB存储引擎是怎么工作的呢?

内存缓冲池

首先介绍InnoDB存储引擎中第一个重要组件—内存缓冲池,即Buffer Pool,这是内存中的一块区域,存储了大量数据,便于执行查询、更新等操作。这样做的目的就是提高SQL语句的执行效率,所以要明确一个概念,我们的查询、更新等操作都是在Buffer Pool中完成(无论数据是否存在于Buffer Pool中,存在的话直接操作,不存在的话先从磁盘中加载到Buffer Pool中再操作)。

undo log日志文件

熟悉数据库的同学都知道,在我们更新数据的时候一般是放在一个事务中进行操作。事务有4大特性:ACID,其中A就代表了原子性,即这次操作要么全部成功要么全部失败,成功的话就提交(commit)事务,失败就回滚(rollback),其中回滚就是通过undo log来实现的。(有一次被问到了,一时紧张没想起来,过了一会才反应过来...)。

一般MySQL数据库会默认开启事务自动提交,所以不需要我们做额外的操作,我们可以通过set autocommit = 0 来关闭自动提交事务和set autocommit来打开自动提交事务。有兴趣可以试试去感受感受。

redolog日志文件

前面我们已经介绍了,更新操作是在Buffer Pool中完成的,也就是在内存中完成的,万一操作完以后MySQL宕机了,那么必然会使内存中修改过的数据丢失。为了解决这个问题InnoDB架构中设计了redo log,用来记录你对什么数据进行了修改。如果出现MySQL宕机,重启之后可以通过redo log来进行数据恢复。但是redo log也是先将redo log写到内存中的redo log buffer中,并没有持久化到磁盘,所以数据丢失的风险依然存在。所以InnoDB提供了几种redo log刷盘策略,通过innodb_flush_log_at_trx_commit来进行设置刷盘策略,比如innodb_flush_log_at_trx_commit=1表示事务提交日志马上刷入磁盘,这样就不会存在数据丢失的风险,但是性能肯定会受到影响。一般可以根据业务需求进行设置策略。

binlog日志文件

binlog也叫归档日志,与redo log不同,这是mySQL Server的,而不是InnoDB所特有的,一般用户恢复某个时间点的数据,主从同步等,而redo log用户故障恢复。一般提交事务的时候也会提交归档日志。同样的归档日志也有几种刷盘策略,通过sync_binlog来控制几次事务提交后会刷盘。特别的sync_binlog=0表示由操作系统控制刷盘时机,而不是Mysql。

InnoDB执行流程

介绍完InnoDB存储引擎的几个组件后,假设现在需要更新一条数据,那么在InnoDB中的执行流程应该是怎么样的呢?如下:

  1. 如果数据不存在于Buffer Pool中,则随机I/O从磁盘读取数据,放入Buffer Pool;
  2. 写undo log用于回滚数据;
  3. 更新Buffer Pool中的数据;
  4. 写redo log到redo log buffer用于故障恢复数据;
  5. 准备提交事务,redo log日志基于策略准备刷入磁盘;
  6. 准备提交事务,binlog日志基于策略准备刷入磁盘;
  7. 写入binlog文件与commit标记到redo log日志文件;
  8. 提交事务;
  9. 后台IO线程将Buffer Pool中脏数据输入磁盘。(因为前期只修改了Buffer Pool中日志,磁盘中数据并未修改,所以对于磁盘数据来说,Buffer Pool中的数据是脏数据)

流程如下图所示:

以上就是MySQL InnoDB架构的相关总结的详细内容,更多关于MySQL InnoDB架构的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL InnoDB架构的相关总结

本文链接: https://lsjlt.com/news/10331.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL InnoDB架构的相关总结
    目录引言1、Mysql数据库整体架构SQL接口解析器优化器执行器存储引擎2、InnoDB存储引擎架构内存缓冲池undo log日志文件redolog日志文件binlog日志文件InnoDB执行流程引言 作为一个后端...
    99+
    2022-05-28
    MySQL InnoDB MySQL InnoDB架构
  • MySQL InnoDB 锁的相关总结
    1.  Shared and Exclusive Locks shared lock (译:共享锁) exclusive lock (译:排它锁、独占锁) InnoDB实现了标准的行级锁,其中有两种类型的锁...
    99+
    2022-05-16
    MySQL InnoDB InnoDB锁
  • MySQL的几个和innodb相关的主要参数设置总结
    1).innodb_buffer_pool_size 为了提升性能,可以把要写的数据先在缓冲区buffer里合并,然后再发送给下一级存储。这样做可以提高I/O读写的效率。 InnoDB Buffer Poo...
    99+
    2024-04-02
  • mysql的相关设置总结
    下文给大家带来关于mysql的相关设置总结,感兴趣的话就一起来看看这篇文章吧,相信看完mysql的相关设置总结对大家多少有点帮助吧。1.安装MySQL    使用管理...
    99+
    2024-04-02
  • MySQL 锁的相关知识总结
    MySQL中的锁 锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发控制主要采用的技术手段(具体可见我之前的文章),而MySQL中的锁就是其中的悲观并发控制。 MySQ...
    99+
    2022-05-14
    MySQL
  • mysql字符集相关总结
    这边笔记主要记录一下对mysql字符集相关知识的学习 字符集 一般我们使用如下语句创建一张表,创建表的时候指定了charset为utf8编码。 CREATE TABLE `test` ( `c1` int U...
    99+
    2022-05-22
    MySQL 字符集
  • Java集合的总体框架相关知识总结
    目录一、集合概述二、集合在开发中的应用三、集合存储的数据四、集合的包五、集合的两大类一、集合概述 数组其实就是一个集合。集合实际上就是一个容器。可以来容纳其它的数据。 二、集合在开发...
    99+
    2024-04-02
  • 【mysql】索引相关的个人总结
    重点参考: MySQL索引原理及慢查询优化 (美团技术分享网站):原理、示例优化都写的很好。 索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!:原理写的很好。 【从入门到入土】令人脱发的数据库底层设计:很详细...
    99+
    2016-06-26
    【mysql】索引相关的个人总结
  • MySQL 日志相关知识总结
    数据库中用于存储数据的文件称为data file,日志文件称为log file。此外,如果每次读写都是直接访问磁盘,性能很差,所以数据库是有缓存的,数据缓存是data buffer,日志缓存log buffer。 s...
    99+
    2022-05-21
    MySQL 日志
  • MySQL数据迁移相关总结
    前言: 在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表、某个库或某个实例。根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题。本篇文章,我们一起来看下 MySQL 数据迁移那些事...
    99+
    2022-05-20
    MySQL 迁移 MySQL 数据迁移
  • MySQL权限相关知识总结
    本篇内容主要讲解“MySQL权限相关知识总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL权限相关知识总结”吧! 一.权限表 mysql中的3个权...
    99+
    2024-04-02
  • Mysql Innodb体系结构
        Innodb体系结构Innodb存储引擎主要包括内存池以及后台线程。内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据、缓存磁盘数据,修改文件前先...
    99+
    2024-04-02
  • Java数据结构之链表相关知识总结
    一、链表 1.1 概述 链表是真正动态的数据结构,最简单的动态数据结构,基本用于辅助组成其他数据结构。 数据存储在“节点”(Node)中 优点:真正的动态,不需要处理固定容量的问题...
    99+
    2024-04-02
  • MySQL 慢日志相关知识总结
    目录  1.慢日志简介  2.慢日志实战  1.慢日志简介 慢日志全称为慢查询日志(Slow Query Log),主要用来记录在 MySQL 中执行时间超过指定时间的 SQL 语句。通...
    99+
    2022-05-22
    MySQL 慢日志
  • 操作MySQL表相关要义总结
    下面讲讲关于操作MySQL表相关要义,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完操作MySQL表相关要义这篇文章你一定会有所受益。使用编辑器编辑指令edit创建表create...
    99+
    2024-04-02
  • 转:Mysql 分区 分表相关总结
    拆分策略选择 其实拆分很灵活,有的是垂直切分,将一个库拆成两个或多个,将有相关联的表放在一个库里。有的是水平切分将数据量大的表按照一定逻辑进行拆分。个人感觉垂直切分的相对来说缓解了IO的瓶颈,而水...
    99+
    2024-04-02
  • Java与Mysql锁相关知识总结
    目录锁的定义锁的实现JVM中的锁synchronizedReentrantLockMysql 锁共享锁(S) 与排它锁(X)作用范围意向锁作用范围记录锁间隙锁Next-Key Loc...
    99+
    2023-05-16
    Java与MySQL中的锁 Java中使用Mysql数据库实现锁 java mysql锁实现
  • MySQL 外键约束和表关系相关总结
    目录外键(Foreign Key)如何确定表关系如何建立表关系一对多关系 - 员工表和部门表多对多一对一表关系总结外键(Foreign Key) 按照上述所说,一张表存储员工信息会极大的浪费资源,重复数据太多,这个...
    99+
    2022-05-18
    MySQL 外键约束 MySQL 表关系
  • Mysql相关知识总结-持续更新~~~
         2019-12-11对varchar类型排序问题的解决 在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍varchar类型排序问题如何解决。 现象...
    99+
    2019-06-22
    Mysql相关知识总结-持续更新~~~
  • Mysql InnoDB 的内存结构详情
    目录1 前言2 InnoDB 存储引擎结构2.1 InnoDB表存储引擎文件2.2 InnoDB 预读机制2.3 InnoDB 特性2.3.1 插入缓存2.3.2 二次写 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作