【MySQL运行原理篇】InnoDB整体架构

InnoDB内部整体架构

【MySQL运行原理篇】InnoDB整体架构_第1张图片

1.体系架构

InnoDB的体系架构如下图所示:
【MySQL运行原理篇】InnoDB整体架构_第2张图片

从InnoDB的体系架构图可以看出,InnoDB主要由后台线程内存池磁盘文件三个部分组成。后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据,此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。

2. 后台线程

InnoDB有不同的后台线程,用于处理不同的任务,主要有以下4类线程,分别是master thread、i/o thread、purge thread和page cleaner thread。

3. In-Memory Structures(内存池结构)

整个InnoDB内存的情况如下图所示:
【MySQL运行原理篇】InnoDB整体架构_第3张图片
InnoDB的内存主要由缓冲池、重做日志缓冲和额外内存池三大部分组成,下面分别进行介绍。

InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。由于CPU和磁盘间的速度差异,通常使用缓冲池技术来提高数据库的整体性能。在InnoDB存储引擎中,缓冲池中页的大小默认为16KB。

(缓存池内部实现:缓冲池的管理,重做日志缓冲,额外的内存池,Checkpoint技术,插入缓冲,两次写,自适应哈希,异步I/O,刷新邻接页,详细请看文章:InnoDB体系架构https://blog.csdn.net/MOU_IT/article/details/119084512)

4. On-Disk Structures(磁盘结构 )

Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间。共享表空间以及独立表空间都是针对数据的存储方式而言的。

4.1、System Tablespace:表空间, 会对应一个(ibdata1)文件:

【MySQL运行原理篇】InnoDB整体架构_第4张图片

  • 优点:可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同的文件上)。数据和文件放在一起方便管理。

  • 缺点:所有的数据和索引存放到一个文件中,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日志系统这类应用最不适合用共享表空间。

4.2、File-per-table(独立表空间)

每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。首先建议使用独立表空间:
在这里插入图片描述

4.3、General TableSpaces

从5.7.6开始,增加了一种新的 tablespace模式(成为general tablespace),实际上它和共享表空间比较类似:创建一个单独的ibd,ibd中包含多个表,兼容不同的格式。general tablespace没有库的概念,因此可以在多个库里建属于同一tablespace的表。

4.4、Temporary TableSpace临时表空间,

用于存放瞬时数据,只有在session连接期间才能够看到数据,比如分组,排序时引发的临时数据存放的区域。

4.5、Redo Log

它属于Innodb引擎的功能,它主要记录数据空间数据的修改状态和内容,它的日志是循环写,日志的空间大小也是固定的,可以作为服务器异常宕机后数据数据自动恢复使用。

4.6、单表.ibd文件内容概述(核心)

InnoDb是以page为单位,将数据从磁盘中读取出来。

  • 默认情况下innodb中的page大小默认是16kb(可配置)。
SHOW VARIABLES LIKE '%page%'
SET GLOBAL innodb_page_size = 16384
#如果是配置文件配置my.cnf:
innodb_page_size = 16384
  • 操作系统中的page大小为4kb
  • 机械硬盘的扇区是512byte
  • SSD中page大小是4KB

以上所说的大小,可以理解为各个层级中,对于磁盘操作的最小单位。就好比:我们每次到电脑的磁盘中获取多少数据放入到内存中。就好比java读取文件一样:byte[] byte = new Byte[16384]

【MySQL运行原理篇】InnoDB整体架构_第5张图片
也就是说:我们在读取一个文件,或者执行一个查询的时候,系统会一次性从磁盘中获取16KB内容放入到内存中。

4.7、InnoDb磁盘数据存储概念图解说明

索引和数据一起存放在文件里面,读取数据时候先读取索引表获取到对应的page,再进行精准查询
【MySQL运行原理篇】InnoDB整体架构_第6张图片

4.8、Innodb执行CURD的过程

  • Innodb引擎,默认执行查询的时候先找到对应表空间的表文件,
  • 然后加载到内存buffer pool 中进行存储,然后在返回,
  • 如果下次在查询如果已经存在内存中就直接返回。修改也是不会直接修改表文件,而是直接修改内存
  • 然后通过redo log进行异步修改表空间的数据。
  • 如果缓冲池的空间不够的时候,就会采用标记算法和LRU把最近最少使用的内存并且没有修改的内存进行清除
  • 用于存放更多的后续执行CURD相关的操作的数据进行缓存。

你可能感兴趣的:(mysql,mysql)