主要作用:
Master Thread 。负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括
IO Thread InnoDB大量使用异步IO(AIO)来处理请求,来提高数据库性能。
show variables like 'innodb_%io_threads'
来查看write和read的线程数show engine innodb status
来查看IO线程的情况Purge Thread。事务被提交后,undolog就不需要了,Purge Thread用来回收已经分配的undo log页。
注意:Purge Thread需要离散地读取undo页。
Page Cleaner Thread 1.2以后引入,将Master Thread中刷新脏页的工作移至该线程。
主要工作:
InnoDB内存池主要有以下部分
InnoDB是基于磁盘存储的,并将其中的记录按照页的方式进行管理。
而缓冲池就是一块内存区域,主要缓冲数据页和索引页。
InnoDB中对页的读取操作,首先判断该页是否在缓冲池中,若在,直接读取该页,若不在则从磁盘读取页数据,并存放在缓冲池中。如果没有空间了,那么就进行LRU
对页的修改操作,首先修改在缓冲池中的页,再以一定的频率(Checkpoint机制)刷新到磁盘。
参数:innodb_buffer_pool_size设置缓冲池大小
缓冲池是一个很大的内存区域,存储各种各样的页,页的默认大小是16KB。
缓冲池的数据页由下面3个列表组成,列表的item都是页。
LRU List使用LRU(Lastest Recent Used)算法:
使用最频繁的放在列表前端
使用最少的放在末端
当缓冲池不够的时候,优先释放末端的页
新页进入缓冲池后,放在末端开始37%的位置,这个位置称为midpoint。通过
show variables like 'innodb_old_blocks_pct'
来查看。
数据库启动时,由于缓冲池是空的,这时页都存储在Free列表中(注意Free列表中的页都是没有数据的,或者数据已没有用)
当需要放新的一页到缓冲池:
* 首先查看Free列表是否有空闲的页
* 如果有,使用
* 如果没有。从LRU列表中删除末端页。
当数据被修改后,会直接写重做日志和修改缓冲池数据,然后直接返回事务执行成功,这时候数据还没有落到硬盘的。(如果这时候数据库宕机,可以通过重做日志来恢复数据)。
所以就会存在一种状态,就是缓冲池的数据和硬盘的数据不一致。这时候缓冲池的这一页称为脏页(注意是缓冲池的数据比硬盘新)。
脏页就存放在Flush List中,脏页也会存储在LRU List中。
Mysql会定期把Flush List的脏页同步到硬盘,这个操作叫Checkpoint。
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 102398
Buffer pool size 8191
Free buffers 7891
Database pages 300
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 266, created 34, written 36
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 300, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
通过show engine innodb status
命令可以查看InnoDB的当前状态。