Master Thread 是一个很是核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO 页的回收等。前端
在 InnoDB 存储引擎中大量使用了 AIO(Async IO)来处理写 IO 请求,这样能够极大提升数据库的性能。而 IO Thread 的主要工做是负责这些 IO 请求的回调处理。算法
innodb_read_io_threads 、 innodb_write_io_threads :分别控制 read thread 和 write thread 数量。数据库
事务被提交后,其所使用的 undolog 可能再也不须要,所以须要 PurgeThread 来回收已经被使用并分配的 undo 页。缓存
用户能够在 MySQL 数据库的配置文件中添加以下命令来启用独立的 Purge Thread(默认是 Master Thread 来完成回收工做):数据结构
innodb_purge_threads=n //innodb 支持多个 Purge Thread架构
做用是将以前版本中脏页的刷新操做都放入到单独的线程中来完成。目的是为了减轻原 Master Thread 的工做及对于用户查询线程的阻塞,进一步提升 InnoDB 存储引擎的性能。并发
在数据库中进行读取页的操做,首先将磁盘读到的页存放在缓冲池中,这个过程称为将页 FIX 在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。不然,读取磁盘上的页。异步
对于数据库中页的修改操做,则首先修改在缓冲池中命中的页,而后再以必定的频率刷新到磁盘上。页从缓冲池刷新回磁盘的操做并非在每次页发生更新时触发,而是经过 Checkpoint 的机制刷新回磁盘。一样,这也是为了提升数据库的总体性能。性能
innodb_buffer_pool_size 设置缓冲池大小spa
缓冲池中缓存的数据页类型有:索引页、数据页、undo 页、插入缓冲、自适应哈希索引、InnoDB 存储的锁信息、数据字典信息等。
从 InnoDB 1.0.x 版本开始,容许有多个缓冲池实例。这样作的好处是减小数据库内部的资源竞争,增长数据库的并发处理能力。可经过下面的参数进行配置:
innodb_buffer_pool_instances=n //该值默认为 1
从 MySQL 5.6 版本开始,能够经过 information_schema 架构下的表 INNODB_BUFFER_POOL_STATS 来观察缓冲的状态。
数据库的缓冲池是经过 LRU(Latest Recent Used,最近最少使用) 算法来进行管理的。即最频繁使用的页在 LRU 列表的前端,而最少使用的页在 LRU 列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放 LRU 列表中尾端的页。
在 InnoDB 存储引擎中,缓冲池中的页默认为 16KB。InnoDB 使用的并不是是朴素的 LRU 算法。
innodb_old_blocks_pct //控制新读取的页插入到 LRU 列表尾端的位置
innodb_old_blocks_time //控制页读取到 mid 位置后须要等待多久才会被加入到 LRU 列表的热端
当页从 LRU 列表的 old 部分加入到 new 部分时,称此时发生的操做为 page made young,而由于 innodb_old_blocks_time 的设置而致使页没有从 old 部分移动到 new 部分的操做称为 page not made young。
Free buffers 表示当前 Free 列表中也的数量
Database pages 表示 LRU 列表中页的数量
可能的状况是 Free buffers 与 Database pages 的数量之和不等于 Buffer pool size。由于缓冲池中的页还可能会被分配给自适应哈希索引、Lock 信息、Insert Buffer 等页,而这部分页不须要 LRU 算法进行维护,所以不存在于 LRU 列表中。
youngs/s、non-youngs/s 表示每秒这两类操做的次数。
Buffer pool hit rate 表示缓冲池命中率,一般该值不该该小于 95%。若发生小于 95% 这种状况,用户须要观察是不是因为全表扫描引发的 LRU 列表被污染的问题。
Modified db pages 显示了脏页的数量。
能够经过 INNODB_BUFFER_POOL_STATS 来观察缓冲池的运行状态。
能够经过表 INNODB_BUFFER_PAGE_LRU 来观察每一个 LRU 列表中每一个页的具体信息。
InnoDB 存储引擎首先将重作日志信息先放入到这个缓冲区,而后按必定频率将其刷新到重作日志文件。
重作日志文件通常不须要设置的很大,由于通常状况下每秒会将重作日志缓冲刷新到日志文件,所以用户只须要保证每秒产生的事务量在这个缓冲大小以内便可。
innodb_log_buffer_size //默认为 8MB
在对一些数据结构自己的内存进行分配时,须要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请。