【MySQL】 InnoDB

学习笔记,来源黑马程序员MySQL教程

文章目录

  • 逻辑存储结构
  • 架构
    • 内存架构
    • 磁盘结构
    • 后台线程
  • 事务原理
    • 概述
    • redo log
    • undo log
  • MVCC
    • 基本概念
    • 实现原理
      • 1、隐藏字段
      • 2、undo log
      • 3、readview
  • 总结

逻辑存储结构

【MySQL】 InnoDB_第1张图片

  • 一个表空间对应一张表
  • 对应B+树上一个 节点
  • Trx id:最后一次使用的id

【MySQL】 InnoDB_第2张图片

架构

【MySQL】 InnoDB_第3张图片

内存架构

【MySQL】 InnoDB_第4张图片

  • 假设没有缓冲区,执行增删改查的时候,每一次数据库都要去操作磁盘空间,就会引起大量的磁盘IO(在业务比较复杂的系统中,大概率是随机IO),性能极低。

【MySQL】 InnoDB_第5张图片

【MySQL】 InnoDB_第6张图片

【MySQL】 InnoDB_第7张图片

  • Buffer Pool:缓冲池,池中存放的最小单位是页
  • Change Buffer:更改缓冲区,针对非唯一的二级索引
  • MySQL服务器通常会将80%的内存分配给缓冲区,以提高执行效率

磁盘结构

【MySQL】 InnoDB_第8张图片
【MySQL】 InnoDB_第9张图片
【MySQL】 InnoDB_第10张图片

  • 当事务提交后,redo log的意义就不大了,它是用来保证出现异常时做数据恢复(持久性)。

后台线程

【MySQL】 InnoDB_第11张图片

  • AIO:异步非阻塞IO,提高性能
  • 业务操作时,会操作整块缓冲区,如果缓冲区没有数据,将磁盘数据加载到缓冲区中,然后进行增删改查。缓冲区会以一定频率通过后台线程刷新到磁盘空间,之后在磁盘空间进行永久化保存。

事务原理

概述

【MySQL】 InnoDB_第12张图片
【MySQL】 InnoDB_第13张图片

redo log

  • 脏页:数据已经被修改过的页,但还没有刷新到磁盘中;

  • 在没有使用redo log的时候,产生脏页通过后台线程以一定时机刷新到磁盘中,有可能出错,此时就无法保证数据的持久性,如下图:【MySQL】 InnoDB_第14张图片

  • 在用到redo log时,首先将增删改的数据记录到 redolog buffer 上 ,当事务提交时,就将该变化的页记录到磁盘上的日志文件(redo log file)中。

  • 如果缓冲池刷新到磁盘上出问题,就可以通过redo 日志文件进行恢复。

Q:为什么不在每一次事务提交的时候就将buffer pool的数据刷新到磁盘中?
A:存在严重的性能问题,事务中的每一个操作都是随机地操作记录,会涉及到大量地随机磁盘IO,而redo log 只刷新日志文件(以追加的方式,是顺序磁盘IO),性能高于随机磁盘IO。
WAL(write-ahead-logging)
【MySQL】 InnoDB_第15张图片

  • 当脏页的数据顺利地刷新到磁盘当中,此时redo log当中记录的日志文件也就不需要了,所以每隔一段时间就会清理redo 日志文件,所以ib_logfile0/1 是循环写的,不会永久保存。

undo log

【MySQL】 InnoDB_第16张图片

MVCC

基本概念

InnoDB默认隔离级别是可重复读,所以当一个事务未提交前,查询到的结果都是相同的,而有可能同一时间其他事务已经将数据修改过,所以第一个事务读取到的数据实际上已经是错误的,这就是快照读。

【MySQL】 InnoDB_第17张图片

实现原理

1、隐藏字段

【MySQL】 InnoDB_第18张图片

-- 查看stu表的表结构
ibd2sdi stu.ibd

【MySQL】 InnoDB_第19张图片
【MySQL】 InnoDB_第20张图片
【MySQL】 InnoDB_第21张图片

2、undo log

在这里插入图片描述
【MySQL】 InnoDB_第22张图片
【MySQL】 InnoDB_第23张图片
【MySQL】 InnoDB_第24张图片

3、readview

【MySQL】 InnoDB_第25张图片
【MySQL】 InnoDB_第26张图片
【MySQL】 InnoDB_第27张图片

RC隔离级别下,根据readview读取到的记录。
【MySQL】 InnoDB_第28张图片
【MySQL】 InnoDB_第29张图片

【MySQL】 InnoDB_第30张图片

  • 一致性:事务在执行之前和执行之后是一致的,那么操作如果执行失败,则全部回滚,执行成功则必须更新,而回滚由undo log、更新由redo log管理

总结

【MySQL】 InnoDB_第31张图片

  • 表空间:包含独占表空间、系统表空间、通用表空间
  • 一个区1M、一个页16K,所以一个区包含64个连续的页,InnoDB引擎分配空间时一次性申请4-5个区,以保证页的连续
  • MVCC:在快照读的时候根据MVCC查找历史版本

你可能感兴趣的:(MySQL,mysql,数据库,服务器)