Innodb存储引擎的体系结构主要由三个部分组成:
- 后台线程
- 内存
- 文件系统
Innodb架构图
Innodb后台线程的作用
我们都知道,磁盘IO是这个操作系统中最慢的一环。减少磁盘操作可以提升性能。
Innodb通过缓冲池将部分数据放在内存中,一部分数据的查询和更新都在内存完成,从而减少磁盘IO操作,提升性能。
如果我们的更新操作都在内存中完成,如果内存不够用或者宕机了怎么办?(内存空间相比硬盘更小、不能持久保存)
Inndo体系结构中的线程扮演的角色就是主要负责将内存中存在、而磁盘中不存在的数据进行同步。
知道了线程的主要作用,那么就开始看看线程中是怎么做的吧
Innodb后台线程的种类
在Innodb中后台线程主要有三个种类:
- Master Thread
- Io Thread
- Purge Thread
为啥搞这么多的线程,用一个线程不可以么
首先,笔者认为用一个线程也一定可以实现既有功能。但是无论是职责上、还是性能上都会存在问题。
职责:软件开发讲究的单一职责,只有单一职责可以让单点在架构中的角色更清晰,也利于维护。
性能:上文描述过后台线程的主要工作是将内存的数据同步到磁盘中,可想而知,这是一个IO操作,而多线程最适合的场景就是IO操作,所以多个线程在性能上一定是比单线程更好的。
Master Thread
master在英文中是主人的意思,MasterThread也就是主线程的意思,根据名字我们都知道这个后台线程在Innodb的职责是最重要的。它负责的主要功能如下:
- 将redo log刷新到磁盘中
- 合并change buffer
- 刷新脏页到磁盘中
- 删除无用的Undo页
这些功能,不一一介绍,因为这些并不是本章的重点,可以理解为这些操作大多数同步内存中的磁盘中,后续章节会详细介绍。
Io Thread
对磁盘进行读写操作的线程,Inndo存储引擎中使用了AIO来处理IO请求,这样可以极大提升数据库的性能。 如果mysql进程所在的操作系统支持nio,同时innodb_user_native_aio设置为on(linux操作系统默认为on)的话,会使用aio进行io操作。 通过设置innodb_read_io_threads和innodb_write_io_threads参数设置对应io线程的数量
Purge Thread
purge是清理的意思,这个后台线程的作用也是用来清理数据。在特定情况下,事务提交后的undo log不会在需要了(讲到事务的时候,会详细介绍undo log), purge thread的作用就是回收undo page