InnoDB体系结构
后台线程
后台线程的主要作用是刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。
InnoDB是多线程的模型,是为了负责不同的任务。
1、Master Thread
通过线程名字就能看出来,Master Thread是一个非常核心的线程,它主要负责将缓存中的数据异步刷新到磁盘中,保证数据的一致性。master thread的线程优先级别最高。其内部几个循环(loop)组成:主循环(loop),后台循环(background loop),刷新循环(flush loop),暂停循环(suspend loop).master thread会根据数据运行的状态在loop,background loop,flush loop和suspend loop中进行切换。
2、IO Thread
InnoDB采用了很多的AIO(Async IO)来处理IO请求,IO Thread的的主要工作就是处理这些异步IO请求的回调。IO Thread主要包含四种:
- write
- read
- insert buffer
- log
可以通过innodb_read_io_threads和innodb_write_io_threads参数进行设置read和write线程的数量
我使用SHOW VARIABLES LIKE ‘innodb_%io_threads’;命令查看了一下自己的mysql的IO thread 情况
3、Purge Thread
Purge Thread用于回收事务提交后不再需要的undolog页。
4、Page Cleaner Thread
其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。而其目的是为了减轻原MasterThread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。
内存
缓冲池
InnoDB存储引擎是基于磁盘存储的,并将其中的数据按照页的方式进行管理。我们知道cpu的计算速度远远高于磁盘的读写速度,所以mysql为了提高性能,使用了缓冲池技术。
缓冲 其实就是内存重的一小块区域,内存的读写速度快于磁盘的读写速度,所以使用内存来减少磁盘速度较慢对数据库性能的影响。
查询
在数据库进行读取数据的时候,mysql数据库首先会将数据所在的页加载进内存的缓冲池中,这个操作成为将页“FIX”在缓冲池中,这样做的好处为当下次读取该页的数据时,先查找缓冲池,如果找到该页则直接从缓冲池中读取该页。从缓冲池中找到该页,成为命中。
修改
当对数据进行修改的时候,也会先在缓冲池中查找该页,然后修改其数据。这个修改实际上是发生在缓冲池当中的,并没有直接修改到数据库中,mysql数据库会已固定的频率将缓冲池中发生修改的数据刷新到数据库磁盘中。
缓冲池中缓存的数据页类型有:
- 索引页
- 数据页
- undo页
- 插入缓冲
- 自适应哈希索引
- 锁信息
- 字典信息
具体的如下图所示: