InnoDB体系架构
Reference: https://time.geekbang.org/column/article/121710
InnoDB体系架构
InnoDB主要包括了内存池、后台线程以及存储文件。
内存池又是由多个内存块组成的,主要包括缓存磁盘数据、redo log缓冲等;
后台线程则包括了Master Thread、IO Thread以及Purge Thread等;
由InnoDB存储引擎实现的表的存储结构文件一般包括表结构文件(.frm)、共享表空间文件(ibdata1)、独占表空间文件(ibd)以及日志文件(redo文件等)等。
1. 内存池
如果客户端从数据库中读取数据是直接从磁盘读取的话,无疑会带来一定的性能瓶颈,缓冲池的作用就是提高整个数据库的读写性能。
客户端读取数据时,如果数据存在于缓冲池中,客户端就会直接读取缓冲池中的数据,否则再去磁盘中读取;对于数据库中的修改数据,首先是修改在缓冲池中的数据,然后再通过Master Thread线程刷新到磁盘上。
理论上来说,缓冲池的内存越大越好。
缓冲池中不仅缓存索引页和数据页,还包括了undo页,插入缓存、自适应哈希索引以及InnoDB的锁信息等等。
InnoDB允许多个缓冲池实例,从而减少数据库内部资源的竞争,增强数据库的并发处理能力。
InnoDB存储引擎会先将重做日志信息放入到缓冲区中,然后再刷新到重做日志文件中。
2. 后台线程
Master Thread 主要负责将缓冲池中的数据异步刷新到磁盘中,除此之外还包括插入缓存、undo页的回收等
IO Thread是负责读写IO的线程
Purge Thread主要用于回收事务已经提交了的undo log
Pager Cleaner Thread是新引入的一个用于协助Master Thread刷新脏页到磁盘的线程,它可以减轻Master Thread的工作压力,减少阻塞
3. 存储文件
在MySQL中建立一张表都会生成一个.frm文件,该文件是用来保存每个表的元数据信息的,主要包含表结构定义。
在InnoDB中,存储数据都是按表空间进行存放的,默认为共享表空间,存储的文件即为共享表空间文件(ibdata1)。若设置了参数innodb_file_per_table为1,则会将存储的数据、索引等信息单独存储在一个独占表空间,因此也会产生一个独占表空间文件(ibd)。
而日志文件则主要是重做日志文件,主要记录事务产生的重做日志,保证事务的一致性。