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可重复读 工作流程图