当前位置: 首页 > article >正文

InnoDB 引擎 底层逻辑

目录

0 课程视频

1 逻辑存储结构

1.1 结构图

1.2 表空间 -> 记录 索引 存储记录 等数据

1.2.1 储存在 cd/var/lib/mysql -> ll -> 目录 mysql.ibd

1.3 段 -> 索引 存储记录 具体存储

1.3.1 数据段 b+树 叶子节点

1.3.2 索引段 b+树的 非叶子节点

1.3.3 回滚段

1.3 区 -> 1M = 16k * 64页

1.4 页 -> 磁盘管理最新单元

1.5 行 -> 数据存储

1.6 InnoDB引擎每次从磁盘申请4-5个区 ->保证页连续性

2 架构

2.1 架构图

2.2.1 架构逻辑图

2.1.2 文件夹文件图

2.2 内存架构

2.2.1 缓冲池 -> 没数据从磁盘加载 -> 缓存经常操作的数据

2.2.2 缓冲池的页page->链表管理-> 空闲/被使用/脏页

2.2.3 更改缓冲池  ->非唯一的二级索引页 -> 结构图详解更改缓冲池

2.2.4 自适应哈希索引 -> 哈希非范围查询快 -> 系统自动判定用不用哈希索引 ->优化

2.2.5 log buffer ->定期刷新到磁盘 -> 默认16M

2.3 磁盘架构

2.3.1 系统表空间 -> cd /var/lib/mysql -> ll -> 数据库名

2.3.2 独立表空间 -> /var/lib/mysql -> ll -> cd 数据库名 ->各个表空间 -> 默认开启 

2.3.3 自定义 通用表空间 -> 创建idb ->cd /var/lib/mysql 文件夹下

 2.3.4 双写缓冲区文件 -> 内存刷新到磁盘前 写入 -> 系统异常时恢复数据

2.4 后台线程 -> 内存数据 刷新策略 -> 磁盘

2.4.1 Master Thread 主线程-

        2.4.1.1 调度其他线程

        2.4.1.2 异步刷新到磁盘

        2.4.1.3 脏页刷新/合并插入缓冲

        2.4.1.4 undo页回收

2.4.2 IO Thread -> 调度 大量的AIO请求

2.4.3 Purge Thread -> 回收事务已提交的 undo log

2.4.4 Page Cleaner Thead -> 协助Master Thread 脏页刷新到磁盘 ->减少阻塞

 2.5 查看 InnoDB 状态信息

3 事务原理

3.1 事务

3.1.1 原子性  ->整体 ->全成功 /全失败 

3.1.2 一致性 -> 所有数据保存一致 

3.1.3 持久性 ->提交 /回滚 -> 数据永久改变 

3.1.4 隔离性 -> 不受外部并发影响 -> 锁 / MVCC

3.2 redo log -> 刷新到磁盘出错 ->调用redo log再次尝试

3.2.1 流程图 ->一致性 持久性

3.3 undo log -> 回滚日志 / 多版本并发控制

3.3.1 如insert操作 -> 记录反向delete操作 -> 回滚用

3.3.2 详细介绍

4 mvcc 多版本并发控制 -> 数据被修改形成多个版本

4.1 课程视频

4.2 

4.2.1 当前读

4.2.2 快照读

4.3 MVVC 实现原理

4.3.1 隐式字段 -> 事务 成功处理

4.3.2 ibd文件查看隐式字段 -> ibd2sdi stu.ibd

4.3.4 undo log -> 记录变更之前数据

4.4.4 undo log 工作流程图 ->版本链

 4.4.5 readview 比较各个版本的id值 判定相应版本数据 是否可用

4.4.6 MVCC RC工作流程图

 4.4.7 MVCC RR可重复读 工作流程图


0 课程视频

https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=133&spm_id_from=pageDriver&vd_source=ff8b7f852278821525f11666b36f180a

1 逻辑存储结构

1.1 结构图

1.2 表空间 -> 记录 索引 存储记录 等数据

1.2.1 储存在 cd/var/lib/mysql -> ll -> 目录 mysql.ibd

cd/var/lib/mysql --> mysql.ibd 文件
cd 表名/ -->都是ibd 表空间文件

1.3 段 -> 索引 存储记录 具体存储

1.3.1 数据段 b+树 叶子节点

1.3.2 索引段 b+树的 非叶子节点

1.3.3 回滚段

1.3 区 -> 1M = 16k * 64页

1.4 页 -> 磁盘管理最新单元

1.5 行 -> 数据存储

1.6 InnoDB引擎每次从磁盘申请4-5个区 ->保证页连续性

2 架构

2.1 架构图

2.2.1 架构逻辑图

2.1.2 文件夹文件图

2.2 内存架构 ->服务器80%内存都会分配给缓冲区

2.2.1 缓冲池 -> 没数据从磁盘加载 -> 缓存经常操作的数据

2.2.2 缓冲池的页page->链表管理-> 空闲/被使用/脏页

2.2.3 更改缓冲池  ->非唯一的二级索引页 -> 结构图详解更改缓冲池

2.2.4 自适应哈希索引 -> 哈希非范围查询快 -> 系统自动判定用不用哈希索引 ->优化

2.2.5 log buffer ->定期刷新到磁盘 -> 默认16M

innodb_log_buffer_size: 大小值
innodb_flush_log_at_trx_commit: 日志刷新到磁盘的时机 
0 --> 每次事务提交则IO 
1 --> 每秒IO
2 -->每次提交事务IO 并 每秒IO

show variables like '%log_buffer_size%'; -->查询日志缓冲区大小
show variables like '%flush_log%';

2.3 磁盘架构

2.3.1 系统表空间 -> cd /var/lib/mysql -> ll -> 数据库名

2.3.2 独立表空间 -> /var/lib/mysql -> ll -> cd 数据库名 ->各个表空间 -> 默认开启 

show variables like '%file_per_table%'; // 查看开启状态

2.3.3 自定义 通用表空间 -> 创建idb ->cd /var/lib/mysql 文件夹下

create tablespace xxx表空间名字 add datafile '对应的磁盘文件名.ibd' engine = innodb ;

 2.3.4 双写缓冲区文件 -> 内存刷新到磁盘前 写入 -> 系统异常时恢复数据

2.4 后台线程 -> 内存数据 刷新策略 -> 磁盘

2.4.1 Master Thread 主线程-

        2.4.1.1 调度其他线程

        2.4.1.2 异步刷新到磁盘

        2.4.1.3 脏页刷新/合并插入缓冲

        2.4.1.4 undo页回收

2.4.2 IO Thread -> 调度 大量的AIO请求

ps: aio 异步非阻塞IO

2.4.3 Purge Thread -> 回收事务已提交的 undo log

2.4.4 Page Cleaner Thead -> 协助Master Thread 脏页刷新到磁盘 ->减少阻塞

 2.5 查看 InnoDB 状态信息

show engine innodb status ;

 

3 事务原理

3.1 事务

3.1.1 原子性  ->整体 ->全成功 /全失败 

3.1.2 一致性 -> 所有数据保存一致 

3.1.3 持久性 ->提交 /回滚 -> 数据永久改变 

3.1.4 隔离性 -> 不受外部并发影响 -> 锁 / MVCC

3.2 redo log -> 刷新到磁盘出错 ->调用redo log再次尝试

3.2.1 流程图 ->一致性 持久性

3.3 undo log -> 回滚日志 / 多版本并发控制

3.3.1 如insert操作 -> 记录反向delete操作 -> 回滚用

3.3.2 详细介绍

4 mvcc 多版本并发控制 -> 数据被修改形成多个版本

4.1 课程视频

https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=141&spm_id_from=pageDriver&vd_source=ff8b7f852278821525f11666b36f180a

4.2 

4.2.1 当前读

4.2.2 快照读

4.3 MVVC 实现原理

4.3.1 隐式字段 -> 事务 成功处理

 

4.3.2 ibd文件查看隐式字段 -> ibd2sdi stu.ibd

centos ->cd 到mysql  -> ibd2sdi stu.ibd 

4.3.4 undo log -> 记录变更之前数据

4.4.4 undo log 工作流程图 ->版本链

 

 4.4.5 readview 比较各个版本的id值 判定相应版本数据 是否可用

 

4.4.6 MVCC RC工作流程图

 4.4.7 MVCC RR可重复读 工作流程图

 


http://www.kler.cn/a/15812.html

相关文章:

  • Chrome和Chromium的区别?浏览器引擎都用的哪些?浏览器引擎的作用?
  • ubuntu将firewall-config导出为.deb文件
  • Docker和VMWare有什么不同
  • 以太坊系地址衍生算法分层确定性生成逻辑
  • sql注入之二次注入(sqlilabs-less24)
  • Spring Boot3 实战案例合集上线了
  • 前端面试题汇总-代码输出篇
  • Spring Schedule如何动态添加修改定时任务
  • 数据库预科与增删查改(CURD)
  • 手搓实现矩阵操作
  • 什么是阻抗?影响阻抗的因素有哪些?
  • java第三天
  • 区块链在元宇宙中的作用(二)
  • ShareSDK 抖音平台注册
  • ubuntu中安装VMware Tools,实现Windows文件拖入Ubuntu
  • Java——一维数组和二维数组(主要详讲一维数组)
  • Vivado约束添加方法:一文全面解析IO和时序约束
  • RSA算法仿真模拟
  • package.json第三方配置
  • Linux 中安装配置 LVS 实现前向代理负载均衡的步骤
  • C++linux高并发服务器项目实践 day4
  • vueuse常用hooks
  • docker登录harbor、K8s拉取镜像报http: server gave HTTP response to HTTPS client
  • Scala语言入门以及基本语法
  • 【Java入门合集】第二章Java语言基础(一)
  • 简单认识 Postman界面操作