简单的聊下 MySQL InnoDB 的各种内存组件及原理
创作不易,关注、点赞,分享,转发,评论,收藏,谢谢。
1、InnoDB 简介
Innodb引擎 提供了对数据库ACID事务的支持,以及提供了行级锁和外键的约束。InnoDB是MySQL的默认事务型引擎,确保事务的完整提交(Commit)和回滚(Rollback)。
InnoDB是Mysql数据库中最重要的存储引擎,想要搞清楚它的结构及各种机制的实现原理对一个成熟的程序员来说非常重要。今天和大家一起讨论一下InnoDB的结构。
- 首先来看一下InnoDB存储引擎简介图
InnoDB的底层结构主要由内存结构和磁盘结构组成,大致情况如下:
1、内存结构
- Buffer Pool
- Change Buffer
- Adaptive Hash Index
- Log Buffer
2、磁盘结构
- Tables
- Indexes
- Tablespaces
- Doublewrite Buffer
- Redo Log
- Undo Logs
2、INNODB内存结构
- InnoDB结构图,如下图所示。
MySQL中每次执行一条SQL语句,对相应表的读写是有存储引擎去执行(更新数据、查询数据)。存储引擎会按照内部逻辑与内存、硬盘交互。
- 下图是存储引擎执行流程:
InnoDB内存结构详解
InnoDB存储引擎在内存中有两个非常重要的组件
- 缓冲池(Buffer Pool)
- 重做日志缓存(redo log buffer)。
3、Buffer Pool
缓冲池中会缓存很多数据,比如数据页、索引页、锁信息等等。
缓冲池是主存中的一个区域,InnoDB在访问它时在这里缓存表和索引数据。
缓冲池用于存储各种数据缓存。Innodb总是按页(16K)将数据(数据库文件)从磁盘读入缓冲池,然后根据最近最少使用算法(LRU)将数据保存在缓冲池中。
- 缓存执行流程如下图:
Buffer Pool 会缓存很多的数据,以便后续的查询与更新,提高了查询检索速度。
- 经典面试题之InnoDB的缓冲池缓存什么?有什么用?
缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。
总结:
(1)缓冲池(buffer pool)总的来说是一种常见的降低磁盘IO访问的机制,提高检索速度;
(2)缓冲池通常以页(page)为单位进行缓存数据,分为数据页(data page)与索引页(index page);
(3)缓冲池的常见管理算法是LRU。
(4)InnoDB对普通LRU进行了优化。
4、redo log buffer 简介
日志缓冲区是用于存储要写入磁盘的日志文件数据的内存区域。
日志缓冲区大小由innodb_log_buffer_size变量定义,默认大小为16MB。日志缓冲区的内容会定期刷新到磁盘。大型日志缓冲区允许运行大型事务,而无需在提交事务之前将重做日志数据写入磁盘。因此,如果您有更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘I/O。
总结
本文主要介绍了InnoDB引擎的结构,并重点介绍了内存结构的各个组成部分。
1.InnoDB引擎的结构分为内存结构和磁盘结构。
2.内存结构由缓冲池、写缓冲区、日志缓冲区和自适应哈希索引组成。
3.缓冲池主要缓存表数据和索引数据,以加快访问速度。在内部,使用基于LRU算法的变体算法来管理缓存对象。
4.更改缓冲区主要用于缓存辅助索引的更新操作,以加快辅助索引的更新。
日志缓冲区使大型事务能够运行,而无需在提交事务之前将重做日志数据写入磁盘,从而节省了磁盘I/O.请注意,在提交事务时,有三种策略来刷新重做日志。
5、MySQL支持的引擎
结束语
获取更多有价值的文章,那就关注一下吧。。。。。。。