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 存储引擎的架构设计,希望对大家有所帮助!

(0)

相关推荐

  • 浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析

    下面先让我们回答一些问题: ◆你的数据库有外键吗? ◆你需要事务支持吗? ◆你需要全文索引吗? ◆你经常使用什么样的查询模式? ◆你的数据有多大? 思考上面这些问题可以让你找到合适的方向,但那并不是绝对的.如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式.如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的,然而,我们其实并不会经常地去测试两百万行记录.所以,就算是慢一点,我们可以通过使用Sphinx从InnoDB中获得全文索引. 数据的大小,是一个影响你

  • MySQL数据库MyISAM存储引擎转为Innodb的方法

    mysql数据库存储引擎为MyISAM的时候,在大访问量的情况下数据表有可能会出现被锁的情况,这就会导致用户连接网站时超时而返回502,此时就需要MySQL数据库MyISAM存储引擎转为Innodb.步骤如下: 1.导出CentOS数据库的表结构 复制代码 代码如下: mysqldump -d -uxxx -p centos > centos_table.sql 其中-d参数表示不导出数据,只导出表结构 2.替换centos_table.sql里的MyISAM为INNODB 复制代码 代码如下:

  • MySQL存储引擎MyISAM与InnoDB的9点区别

    虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是它俩了.可能有站长并未注意过MySQL的存储引擎,其实存储引擎也是数据库设计里的一大重要点,那么博客系统应该使用哪种存储引擎呢?下面我们分别来看两种存储引擎的区别. MySQL存储引擎MyISAM与InnoDB的区别 一.InnoDB支持事务,MyISAM不支持,这一点是非常之重要.事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了. 二.MyISAM适合查询以及插入为主的

  • MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点:不支持事务处理(transaction).不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完

  • Mysql5.5 InnoDB存储引擎配置和优化

    环境为CentOS系统,1G内存,Mysql5.5.30.在/etc/my.cnf内添加: 复制代码 代码如下: skip-external-lockingskip-name-resolvemax_connections = 1024query_cache_size = 16Msort_buffer_size = 1Mtable_cache = 256innodb_buffer_pool_size = 128Minnodb_additional_mem_pool_size = 4Minnodb_

  • MySQL存储引擎MyISAM与InnoDB区别总结整理

    1.MySQL默认存储引擎的变迁 在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB. 2.MyISAM与InnoDB存储引擎的主要特点 MyISAM存储引擎的特点是:表级锁.不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发.重负荷生产系统上,表锁结构的特性就显得力不从心: 以下是MySQL 5.7 MyISAM存储引擎的版本特性: InnoDB存储引擎的特点是:行级锁.事务安全(A

  • MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计

    一.存储引擎 上节我们最后说到,SQL 的执行计划是执行器组件调用存储引擎的接口来完成的. 那我们可以理解为:MySQL 这个数据库管理系统是依靠存储引擎与存放数据的磁盘文件进行交互的. 那么 MySQL 有哪些存储引擎呢? 主要有 MyISAM.InnoDB.Memory等等.而现在互联网中,基本都是使用 InnoDB 存储引擎,所以接下来我将简单总结自己关于 InnoDB 存储引擎的学习,比较简单的介绍 InnoDB 存储引擎里面的组件. 二.缓冲池 我们现在都知道了,数据库的数据是存放在磁

  • MySQL学习(七):Innodb存储引擎索引的实现原理详解

    概述 在数据库当中,索引就跟树的目录一样用来加快数据的查找速度,对于一个SQL查询操作,根据索引快速过滤掉不符合要求的数据并定位到符合要求的数据,从而不需要扫描整个表来获取所需的数据. 在innodb存储引擎中,主要是基于B+树来实现索引,在非叶子节点存放索引关键字,在叶子节点存放数据记录或者主键索引(或者说是聚簇索引)中的主键值,所有的数据记录都在同一层,叶子节点,即数据记录直接之间通过指针相连,构成一个双向链表,从而可以方便地遍历到所有的或者某一范围的数据记录. B树,B+树 B树和B+树都

  • MySQL InnoDB存储引擎的深入探秘

    前言 在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中.从MySQL5.5.8开始,InnoDB成为其默认的存储引擎.InnoDB存储引擎支持事务.其设计目标主要是面向OLTP的应用,主要特点有:支持事务.行锁设计支持高并发.外键支持.自动崩溃恢复.聚簇索引的方式组织表结构等. 体系架构 InnoDB存储引擎是由内存池.后台线程.磁盘存储三大部分组成. 线程 InnoDB 使用的是多线程模型, 其后台有多个不同的线程负责处理不同的任务 Master Thread Maste

  • 简述MySQL InnoDB存储引擎

    前言: 存储引擎是数据库的核心,对于 MySQL 来说,存储引擎是以插件的形式运行的.虽然 MySQL 支持种类繁多的存储引擎,但最常用的当属 InnoDB 了,本篇文章将主要介绍 InnoDB 存储引擎相关知识. 1. InnoDB 简介 MySQL 5.5 版本以后,默认存储引擎就是 InnoDB 了.InnoDB 是一种兼顾了高可靠性和高性能的通用存储引擎.在 MySQL 5.7 中,除非你配置了其他默认存储引擎,否则执行 CREATE TABLE 不指定 ENGINE 的语句将创建一个

  • MySQL中InnoDB存储引擎的锁的基本使用教程

    MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 各种锁特点 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生冲突的概率最高,并发度最低 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高 页面锁:开销和加锁时间介于表锁和行锁之间:会出现死锁:锁定粒度介于表锁和行锁之

  • 详解MySQL InnoDB存储引擎的内存管理

    存储引擎之内存管理 在InnoDB存储引擎中,数据库中的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理的,即最频繁使用的页在LRU列表的最前段,而最少使用的页在LRU列表的尾端,当缓冲池不能存放新读取到的页时,首先释放LRU列表尾端的页. 上面的图中,我使用8个数据页来表示队列,具体作用,先卖个关子.在InnoDB存储引擎中,缓冲池中页的默认大小是16KB,LRU列表中有一个midpoint的位置,新读取到的数据页并不是直接放入到LRU列表的首部,而是放入

  • 详解MySql中InnoDB存储引擎中的各种锁

    目录 什么是锁 InnoDB存储引擎中的锁 锁的算法 行锁的3种算法 幻像问题 锁的问题 脏读 不可重复读 丢失更新 死锁 什么是锁 现实生活中的锁是为了保护你的私有物品,在数据库中锁是为了解决资源争抢的问题,锁是数据库系统区别于文件系统的一个关键特性.锁机制用于管理对共享资源的并发访. 数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性 InnoDB存储引擎区别于MyISAM的两个重要特征就是:InnoDB存储引擎支持事务和行级别的锁,MyISAM只支持表级别的锁 In

  • Mysql Innodb存储引擎之索引与算法

    目录 一.概述 二.数据结构与算法 1.二分查找 2.二叉查找树和平衡二叉树 1)二叉查找树 2)平衡二叉树 三.B+树 1.B+树完整定义 2.关于 M 和 L的选定案例 四.B+树索引 1.聚集索引 2.辅助索引 五.关于 Cardinality 值 1.Cardinality定义 2.Cardinality的更新 六.B+树索引的使用 1.联合索引 2.覆盖索引 3.优化器选择不使用索引的情况 4.索引提示 5.Multi-Range Read 优化 (MRR) 6.Index Condi

  • MySQL InnoDB 存储引擎的底层逻辑架构

    目录 正文 内存架构 1. 自适应哈希索引 2. Buffer pool 3. Change buffer 4. Log Buffer 磁盘架构 1. 系统表空间 2. 独立表空间 3. 普通表空间 4. Undo 表空间 5. 临时表空间 总结 正文 我们都知道 MySQL 数据库有很多个存储引擎,其中另我们印象深刻的应该是 InnoDB 存储引擎,它从 MySQL 5.5 之后就是默认的存储引擎,它有支持事务.行级锁.MVCC 以及外键等优点. 那么你知道InnoDB存储引擎的底层逻辑架构吗

  • MySql InnoDB存储引擎之Buffer Pool运行原理讲解

    目录 1. 前言 2. Buffer Pool 2.1 Buffer Pool结构 2.2 Free链表 2.3 缓冲页哈希表 2.4 Flush链表 2.5 LRU链表 2.6 多个实例 2.7 Buffer Pool状态信息 3. 总结 1. 前言 我们已经知道,对于InnoDB存储引擎而言,页是磁盘和内存交互的基本单位.哪怕你要读取一条记录,InnoDB也会将整个索引页加载到内存.哪怕你只改了1个字节的数据,该索引页就是脏页了,整个索引页都要刷新到磁盘.InnoDB是基于磁盘的存储引擎,如

随机推荐