逻辑存储结构逻辑存储结构图
![MYSQL-->InnoDB引擎底层原理](http://img.zhejianglong.com/231018/11013W5R-0.png)
文章插图
- 表空间
表空间文件在Linux下存放在 /var/lib/mysql文件中的 xxx.ibd 文件就是表空间文件
表空间文件用来存储,记录 , 索引等数据 。
- 段
段分为,数据段(Leaf node segment) ,索引段(Non-leaf node segment),回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点,索引段就是非叶子节点 , 段用来管理Extend(区) 。
一个段相当于一张表
- 区
区是表空间的单元结构,每个区大小为1M,默认情况下InnoDB存储引擎页大小为16k,一个区一共16个连续的页 。
- 页
页 , 是InnoDB存储引擎磁盘管理的最小单元 。
每个区默认16KB,为了保证页的连续性,InnoDB存储引擎每次从磁盘申请4到5个区 。
- 行
行指的是InnoDB存储的数据
表结构中俩个隐藏字段
Trx_id:最后一次操作事务的id
Roll pointer:指针,指向增删改之前的数据,可以拿这个找到修改之前的数据 。
它擅长事务处理,具有崩溃恢复性特性!
下图为InnoDB架构图,左边为内存结构,右边为磁盘结构 。
![MYSQL-->InnoDB引擎底层原理](http://img.zhejianglong.com/231018/11013R230-1.png)
文章插图
内存结构
![MYSQL-->InnoDB引擎底层原理](http://img.zhejianglong.com/231018/11013T407-2.png)
文章插图
Buffer Pool(缓冲池)缓冲池是主内存的一个区域,里面可以缓存磁盘上经常操作的真实数据 。
在执行增删改查操作的时候,先操作缓存池中的数据(如果没有,从磁盘加载并且缓存)
然后以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度
在缓存池中有一块一块的 , 这个是页 。
缓存池以页为单位,底层采用链表数据结构管理Page 。
根据状态将Page分为三类:
- free page :空闲页,未被使用的页 。
- clean page :被使用的页 , 数据没有被修改过 。
- dirty page :脏页,被使用的页,页中数据和磁盘中数据不一致 。
更改缓存区,主要针对非唯一的二级索引 。
在执行DML语句时 , 如果这些数据页不在Buffer Poor中,不会直接操作磁盘 , 而是将数据变更在更改缓存区Change Buffer中 。
在未来数据被读取的时候 , 再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中 。
意义
和聚集索引不同,二级索引是非唯一的!
并且二级索引以相对随机的顺序插入 。
同样的删除和更新可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量磁盘IO 。
有了ChangeBuffer后,我们可以在缓冲池中进行合并处理减少磁盘IO
Log Buffer(日志缓存区)日志缓存区,用来保存要写入磁盘中的log日志数据(redo log 、undo log) 。
默认大小16MB,日志缓存区的日志会定期刷新到磁盘中 。如果需要更新、插入、或删除多行的事务,增加日志缓存区大小可以节约磁盘IO
在系统变量中设置即可Adaaptive Hash index(自适应哈希索引)自适应哈希索引,用于优化Buffer Pool数据的查询 。
关键字:
innodb_log_buffer_size 缓存区大小
【MYSQL-->InnoDB引擎底层原理】innodb_flush_log_at_trx_commit 日志刷新到磁盘的时机
1代表的是日志在每次事务提交时写入并刷新到磁盘
0代表每秒将日志写入并刷新到磁盘一次
2代表日志在每次事务提交后写入,并且每秒刷新到磁盘一次
InnoDB存储引擎会监控表上各索引页的查询,如果观察到hash索引可以提高速度,就会建立hash索引 。
这个叫自适应哈希索引
可以在系统变量中查询是否开启自适应哈希索引磁盘结构
关键字是 adaptive_hash_index
![MYSQL-->InnoDB引擎底层原理](http://img.zhejianglong.com/231018/11013WP0-3.png)
文章插图
System Tablespace(系统表空间)系统表空间是change Buffer的存放区域 。
关键字:innodb_data_file_pathFile-Per-Table Tablespaces存放每个表的独立表空间
系统表空间存放路径
默认是开启的-->开启后代表每一张表都会生成对应的表空间文件 。
xxx.ibd结尾的文件都是表的表空间文件
推荐阅读
- VLQ & Base64 VLQ 编码方式的原理及代码实现
- StampedLock:一个并发编程中非常重要的票据锁
- Longchamp龙骧饺子包
- <三>从编译器角度理解C++代码编译和链接原理
- <一>关于进程虚拟地址空间区域内存划分和布局
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
- 🔥支持 Java 19 的轻量级应用开发框架,Solon v1.10.4 发布
- Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
- InnoDB关于事务、锁、MVCC专题
- XXI Open Cup, Grand Prix of Belarus 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest 题解