转载~
在Innodb存储引擎中,后台线程的主要作用是「负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据」。此外它会将已经修改的数据文件刷新到磁盘文件中,保证在发生异常的情况下,Innodb能够恢复到正常的运行状态。
「InnoDB存储引擎是多线程的模型,所以有多个不同的后台线程,负责处理不同的任务」。主要有:
Master Thread、IO Thread、Purge Thread、Page Cleaner Thread四种。
「Master thread是InnoDB的主线程,负责调度其他各线程,优先级最高」。
Master thread内部有两个主要处理时机,分别是每隔1秒和10秒处理。
「为了提高数据库的性能,在InnoDB中使用了大量的AIO(Async IO)来做读写处理」。
一共有4种总共10个IO Thread:
「read thread」(4个)
负责读取操作,将数据从磁盘加载到Buffer Pool的Page页。
「write thread」(4个)
负责写操作,将Buffer Pool的dirty page刷新到磁盘。
show variables like "%innodb%io_threads%";
「log thread」(1个)
负责将Log Buffer内容刷新到磁盘。
「insert buffer thread」(1个)
负责将Change Buffer内容刷新到磁盘。
#查看当前IO线程的工作状态
show engine innodb status;
事务提交之后,其使用的undo日志将不再需要,因此需要Purge Thread回收已经分配的undo 页。
早前的版本只支持一个Purge Thread,目前mysql 5.7版本支持多个Purge Thread,目的是为了进一步加快undo数据页的回收速度。
show variables like '%innodb_purge_threads%';
「作用是将脏数据放入到单独的线程中刷新到磁盘,脏数据刷盘后相应的redo log也就可以覆盖,即可以同步数据,又能达到redo log循环使用的目的」。
减轻原来的Master Thread的工作,同时可以缓解用户查询线程的阻塞,进一步提高Innodb 存储引擎的性能。
show variables like '%innodb_page_cleaners%';