一、逻辑存储结构
逻辑存储单元(由大到小):表空间、段、区、页、行
二、架构
MySQL 5.5 开始,默认使用 InnoDB 存储引擎,它擅长事务处理并具有崩溃恢复的特性。
2.1 架构图
下面是 InnoDB 架构图,左侧为内存结构,右侧为磁盘结构
2.2 内存结构
MySQL 5.x 版本是 插入缓冲区(Insert Buffer)。在 MySQL 8.0 版本之后,引入 更改缓冲区(Change Buffer)
2.2.1 Buffer Pool(缓冲池)
缓冲池是主内存中的一个区域,缓存磁盘上经常操作的真实数据。在执行增删改查时,先操作缓冲池数据(若缓冲池没有,则从磁盘加载并缓存入缓冲池),然后再以一定频率刷新到磁盘中,从而减少磁盘I/O,加快处理速度
缓冲池以 Page页 为单位,底层采用链表数据结构管理 Page
根据状态将 Page 分为三种类型:
- free page:空闲页,未被使用
- clean page:被使用的页,数据没有被修改过
- dirty page:脏页,被使用的页,数据被修改过,页中数据与磁盘数据不一致
2.2.2 Change Buffer(更改缓冲区)
更改缓冲区:针对于非唯一二级索引页,在执行 DML 语句时,如果这些 数据Page 没有在 Buffer Pool 中,不会直接操作磁盘,而是会将数据变更存在 Change Buffer 中,在未来数据被读取时,再将数据合并恢复到 Buffer Pool 中,再将合并后的数据刷新到磁盘中
Change Buffer 意义
与聚集索引不同,二级索引通常是非唯一的,且以相对随机的顺序插入二级索引。当删除和更新时会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会产生大量的磁盘I/O。有了 Change Buffer 后,我们可以在 Buffer Pool 中进行合并处理,减少磁盘I/O
2.2.3 Adaptive Hash Index(自适应 Hash 索引)
自适应 Hash 索引:用于优化对 Buffer Pool 数据的查询。InnoDB 存储引擎会对表上各索引页的查询进行监控,当观察到 hash 索引可以提升速度时,则会建立 Hash 索引
自适应 Hash 索引无需人工干预,由系统根据情况自动完成
参数:adaptive_hash_index
## 查询是否开启 hash
show variables like '%hash_index%';
2.2.4 Log Buffer(日志缓冲区)
日志缓冲区:保存要写入磁盘中的 log 日志数据(redo log、undo log)。会定期刷到磁盘中
默认大小:16MB
如果需要更新、插入、删除 许多行事务,增大 Log Buffer 大小可以节省磁盘 I/O
-- 参数
innodb_log_buffer_size:缓冲区大小
innodb_flush_log_at_trx_commit:日志刷新到磁盘时机
1:日志在每次事务提交时写入并刷新到磁盘
0:每秒将日志写入并刷新到磁盘一次
2:日志在每次事务提交后写入,并每秒刷新到磁盘一次
-- 查询日志缓冲区大小
show variables like '%log_buffer_size%';
-- 查询日志缓冲区刷新到磁盘的时机
show variables like '%flush_log%';