Innodb 存储引擎 学习笔记 -第二章-Innodb存储引擎

Innodb体系架构

Innodb有多个内存块,这些内存块组成了一个大的内存池

Innodb是多线程模型,因此后台有多个不同的后台线程,负责处理不同的任务

后台线程:

1.Master thread

 负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲,undo页的回收。

2.I/O thread

Innodb中使用了大量的异步IO处理写请求--》IO thread主要负责这些IO的回调(callback ),

主要包括四类thread: log,read,write ,insert buffer

mysql> show engine innodb status;
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,

3.purge thread

事务被提交后,所使用的undolog可能不再被需要,因此需要 purge thread 来回收已经使用并分配的undo页 

mysql> show variables like 'innodb_purge_threads'\G;
*************************** 1. row ***************************
Variable_name: innodb_purge_threads
        Value: 4
1 row in set (0.00 sec)

可以看到有四个 purge thread


 

Innodb关键特性

缓冲池:一块内存中的区域,用于弥补cpu与磁盘之间速度之间的鸿沟。

数据库在进行读取页的操作时,首先将磁盘读到的页放到缓冲池,下一次再读相同的页时,首先判断该页是否在缓冲池中,如果命中,直接读取该页,否则,读取磁盘上的页。

数据库对页的修改-》首先修改缓冲池中的页,然后以一定的频率刷新到磁盘上。

 

查看innodb缓冲池大小:

大小为8MB;

缓存池中缓存的数据页有:

索引页,数据页,undo页,插入缓冲和,自适应哈希,innodb存储的锁信息等。

允许有多块缓冲池,默认个数为1

mysql> show variables like 'innodb_buffer_pool_instances'\G;
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_instances
        Value: 1
1 row in set (0.00 sec)

 

缓冲池管理方式:

Free List : 空闲列表。数据库刚启动时,LRU列表是空的,需要从Free List 中分配页。

LRU List : 数据库的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法进行管理的。最频繁使用的页放在LRU列表前端,最少使用的页放在LRU列表尾端。

Flush List : 脏页列表。LRU列表中的页被修改后成为脏页,数据库通过checkpoint机制将脏页刷新会磁盘中。

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 140621
Buffer pool size   8191
Free buffers       7857
Database pages     334
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 300, created 34, written 38
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: 334, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

Buffer pool size :共有8191页

Free buffers     :free 列表中页的数量

Database pages    :LRU列表中页的数量

 

Innodb特性:异步IO (AIO)

同步IO:每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。

异步IO:用户可以在发出一个IO请求后立即在发出另外一个IO请求,当全部IIO请求发送完毕后,等待所有IO操作完成。

Innodb1.1x开始提供内核级别AIO支持,称为Native AIO:

刷新邻接页

Innodb还提供Flush neighbor page特性:当刷新一个脏页时,Innodb会检查该页所在区的所有页,如果是脏页,那么一起刷新。

通过异步IO(AOI)可以将多个IO写入操作合并为一个IO。


CheckPoint技术

在LRU列表的页被修改以后,称为脏页,即缓冲池的页和磁盘的页的数据产生了不一致,这时候数据库会通过CHECKPOINT机制将脏页刷新回磁盘。

如果从缓冲池将脏页刷新到磁盘时发生了宕机,那么数据就不能恢复了。为了避免数据丢失,数据库系统普遍采用了Write after Log策略,即,当事务提交时,先写重做日志,再修改页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值