【大白话系列】MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计
一、存储引擎
上节我们最后说到,SQL 的执行计划是执行器组件调用存储引擎的接口来完成的。
那我们可以理解为:MySQL 这个数据库管理系统是依靠存储引擎与存放数据的磁盘文件进行交互的。
那么 MySQL 有哪些存储引擎呢?
主要有 MyISAM、InnoDB、Memory等等。而现在互联网中,基本都是使用 InnoDB 存储引擎,所以接下来我将简单总结自己关于 InnoDB 存储引擎的学习,比较简单的介绍 InnoDB 存储引擎里面的组件。
二、缓冲池
我们现在都知道了,数据库的数据是存放在磁盘文件中的。
那么,我们每次对表的增删改查都是直接在磁盘文件里面操作吗?
答案:不是的!
因为磁盘文件的随机读写的性能是非常差的,如果所有操作都在磁盘中进行,那么就不会有高性能 MySQL 的说法了,MySQL 也不能支持高并发,也不会在互联网中如此的流行。
这时候要引入 InnoDB 存储引擎最重要的一个组件,就是缓冲池(Buffer Pool),它是一个非常重要的内存结构。它是内存里面的,凭借着内存非常高性能的读写,使得 MySQL 能够支持高并发。
缓冲池(Buffer Pool) 的使用原理:
我们先复习一下 MySQL 接收请求的过程。
①、MySQL 的工作线程专门监听数据库连接池的连接,有连接就获取连接中的 SQL 语句。
②、然后将 SQL 语句交给 SQL 接口 去处理,SQL 接口里会进行下面的一系列流程。
③、查询解析器 将 SQL 语句解析成 MySQL 能理解的东西。
④、接着 查询优化器 去为 SQL 语句制定一套最优的执行计划。
⑤、执行器 会根据执行计划去调用存储引擎的接口。
上面是上篇文章总结到的东西,那么存储引擎的接口是怎么进行增删改查的呢?以更新操作为例,其他的同理。
首先,存储引擎会先判断更新 SQL 对应的数据行是否在 缓冲池(Buffer Pool) 里面。如果在的话就直接在 缓冲池(Buffer Pool) 里更新数据然后返回;如果不在,则从磁盘文件里读取数据到 缓冲池(Buffer Pool) 里,然后进行更新操作,最后再返回结果。
三、undo 日志文件
我们都知道,在事务中,事务提交前是可以随时回滚对数据的更新的。那么是依靠什么来做的呢?
依靠的是 undo 日志文件。
undo 日志文件的使用原理:
更新数据为例:
假如你更新某行 id=100 的数据,将字段 name 由原来的“张三”改为“李四”,那么此时会将 "id=10" 和 “name=张三” 这两个关键信息写入 undo 日志文件中。
当你事务提交前需要回滚,就会从 undo 日志文件 中找到这两个关键字,然后进行更新操作的回滚。
四、redo log buffer
上面说到,所有的增删改查操作其实是在缓冲池里面进行的,所以其实对数据的修改并没有立刻落实到磁盘文件里面。
那么有一个问题:在缓冲池的脏数据刷回磁盘文件中前,MySQL 宕机了怎么办?
此时 InnoDB 存储引擎提供了一个非常重要的组件,就是 redo log buffer 组件.,它也是内存里的一块缓冲区。
redo log buffer 的使用原理:
还是以上面的更新操作为例,当数据更新后,会记录下数据更新的的关键信息,对应的就是 redo 日志,然后写入 redo log buffer 里。
但是还是会有一个问题,上面说到,redo log buffer 也是在内存里的。那当 MySQL 宕机时,由于内存里的所有数据都会丢失,所以缓冲池的脏数据和 redo log buffer 的日志还是会全部丢失。
这样会造成一种情况,客户端收到更新成功的信息了,但是最后数据库里头的数据还是没更新成功。
所以,redo log buffer 还有一个刷盘策略。正常是,当事务提交时,会将 redo log buffer 里的 redo 日志 刷回到磁盘中,这样就不用担心,事务提交成功,但是更新数据可能会丢失的问题了。即使在 缓冲池(Buffer Pool) 的脏数据刷回磁盘前, MySQL 宕机了,也不会丢失数据,因为 MySQL 重启时可以根据磁盘中的 redo 日志 恢复之前所有脏数据的更新。
【大白话系列】MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计的更多相关文章
- MySQL InnoDB存储引擎体系架构 —— 索引高级
转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...
- 干货!MySQL 的 InnoDB 存储引擎是怎么设计的?
MySQL 里还有什么其他成员呢? 对于 MySQL,要记住.或者要放在你随时可以找到的地方的两张图,一张是 MySQL 架构图,另一张则是 InnoDB 架构图: 遇到问题,或者学习到新知识点时,就 ...
- 【大白话系列】MySQL 学习总结 之 初步了解 MySQL Server 的 binlog 组件
一.上节回顾 上节我们讲到,建议将 redo log 的刷盘策略设置为1:即提交事务时,强制将 redo log buffer 里的 redo log 刷入到磁盘后才算事务提交成功. 但是我们都知道, ...
- 《MySQL技术内幕:InnoDB存储引擎(第2版)》书摘
MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方 ...
- MySQL 温故而知新--Innodb存储引擎中的锁
近期碰到非常多锁问题.所以攻克了后,细致再去阅读了关于锁的书籍,整理例如以下:1,锁的种类 Innodb存储引擎实现了例如以下2种标准的行级锁: ? 共享锁(S lock),同意事务读取一行数据. ? ...
- 关于MySql 数据库InnoDB存储引擎介绍
熟悉MySQL的人,都知道InnoDB存储引擎,如大家所知,Redo Log是innodb的核心事务日志之一,innodb写入Redo Log后就会提交事务,而非写入到Datafile.之后innod ...
- mysql学习【第6篇】:权限和数据库设计
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第6篇]:权限和数据库设计 用户和权限管理 /* 用户和权限管理 */ ---- ...
- 《MySQL技术内幕 InnoDB存储引擎 》学习笔记
第1章 MySQL体系结构和存储引擎 1.3 MySQL存储引擎 数据库和文件系统最大的区别在于:数据库是支持事务的 InnoDB存储引擎: MySQL5.5.8之后默认的存储引擎,主要面向OLTP ...
- MySQL Innodb 存储引擎学习篇
master thread的县城优先级别最高.其内部由几个循环(loop)组成:主循环(loop).后台循环(background loop).刷新循环(flush loop).暂停循环(suspen ...
随机推荐
- $Poj2054\ Color\ a\ Tree\ $ 贪心
$poj$ $Description$ 一颗树有 $n$ 个节点,这些节点被标号为:$1,2,3…n,$每个节点 $i$ 都有一个权值 $A[i]$. 现在要把这棵树的节点全部染色,染色的规则是: 根 ...
- $Poj1821\ Fence\ $单调队列优化$DP$
Poj Acwing Description 有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到P ...
- 一文详解滑动平均法、滑动平均模型法(Moving average,MA)
任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI.算法.编程和大数据知识分享,以及免费的SSR节点和 ...
- 大数据框架开发基础之Zookeeper入门
Zookeeper是Hadoop分布式调度服务,用来构建分布式应用系统.构建一个分布式应用是一个很复杂的事情,主要的原因是我们需要合理有效的处理分布式集群中的部分失败的问题.例如,集群中的节点在相互通 ...
- 使用Rancher Server部署本地多节点K8S集群
当我第一次开始我的Kubernetes之旅时,我一直在寻找一种设置本地部署环境的方式.很多人常常会使用minikube或microk8s,这两者非常适合新手在单节点集群环境下进行操作.但当我已经了解了 ...
- Tomcat黑窗口中对于中文乱码问题的解决
存在的问题: 如标题,下图所示,启动tomcat时黑窗口中中文乱码,影响查看程序打印信息 解决方案: tomcat安装/解压目录中,conf 文件夹下 logging.properties 文件中,代 ...
- centos7+docker+elasticsearch 安装记录+踩坑
版本: cenos7 :3.10.0-957.21.3.el7.x86_64 (内核需>=3.10 才可以安装) docker: yum安装版本为1.13.1 elasticsearch: 6 ...
- Spring MVC系列之模型绑定(SpringBoot)(七)
前言 上一节我们在SpringBoot中启用了Spring MVC最终输出了HelloWorld,本节我们来讲讲Spring MVC中的模型绑定,这个名称来源于.NET或.NET Core,不知是否恰 ...
- 8款极具表现力的jQuery/CSS3网页菜单
上一篇我向大家分享了7款效果震憾的HTML5应用组件,今天主要来分享一下CSS3网页菜单,因为在一个网站中,菜单起着举足轻重的作用,所以作为WEB开发人员,我们有必要将网站的菜单设计得尽量完美,下面向 ...
- 曹工说Spring Boot源码(9)-- Spring解析xml文件,到底从中得到了什么(context命名空间上)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...