InnoDB深入理解

InnoDB体系架构 (存储引擎内存池,后台现成)

简单的将就是两个部分,一个是一个存储引擎内存池,还有一个就是有很多个后台线程,具体的讲是7个,4个IO线程 1个主要线程,1个锁监控线程,1个错误监控线程,四个IO分别是插入缓冲,日志 读 写。

存储引擎内存池具体的说是一个缓冲池,重做日志缓冲池,以及额外的内存池三个部分。一般缓冲池的大小是最大的,重做日志缓冲池和额外内存池比较小。

缓冲池主要是用来存放各种数据,这个地方牵扯到了InnoDB工作方式,就是将数据库文件按页读取到缓冲池,如果数据库文件需要修改,也是先修改缓冲池,然后刷新到文件的。

一般缓冲池中存放的是索引页,数据页,还有插入缓冲,自适应哈希索引,InnoDB的锁信息,数据字典等。

重做日志缓冲池,一般是将重做日志信息放到这个缓冲区中,然后按照一定频率将其刷新到文件。

额外内存缓冲池也很重要,对一些数据结构本身分配内存时,需要从额外缓冲池中分配。

综上,我们可以归纳出InnoDB体系结构

1.存储引擎池,

a) 缓冲池,用来缓存各种数据,索引,数据,锁的信息,错误信息等

b) 重做日志缓冲池,重做日志信息会放到这个缓冲池中,然后刷新到日志文件

c) 额外内存缓冲池,数据结构本身信息存放。

2. 7个线程

a) 4个IO线程 插入缓冲 读 写 日志

b) 1个锁监控线程

c) 1个错误监控线程

d) 1个主要线程

InnoDB的关键特性 (插入缓冲 两次写 自适应哈希)

1.插入缓冲,主要是针对非主键索引的插入和更新操作,如果是主键索引,顺序的插入就可以了,数据页的存放还是主键id的执行顺序,但是非主键索引,叶子节点的插入不再是顺序的,这个时候需要离散的访问非聚集索引,插入性能会变得很低。

插入缓冲的作用就是,对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是先判断非聚集索引页是否里,如果存在,那么直接插入,不存在就先插入到缓冲池中,然后以一定的频率合并缓冲区和索引页。

插入缓冲使用满足两个条件,1,非聚集索引, 2,索引不是唯一的

插入缓冲存在一个问题,在写密集的时候,插入缓冲会占用过多缓冲池内存,默认情况下最大可以占用1/2缓冲池内存。

2.两次写

如果说插入缓冲给InnoDB带来的是性能,那么两次写给InnoDB带来的就是数据的可靠性,如果在写一个页的时候,服务器宕机,那么就会导致这个页只写了一部分的情况,我们称这种情况叫做写失效,两次写就是准备一个副本,当写失效的时候,通过写副本来恢复原来的数据,在进行重做,至于如果进行,InnoDB存储引擎提供了一个两次写缓冲,大小为2M,另一个就是物理磁盘上共享表空间中连续的128个页。

当操作系统将页写入磁盘的时候宕掉了,那么在恢复过程中,InnoDB存储引擎可以从共享表空间中的doublewrite中找到该页的副本,然后将副本拷贝到表空间,在做重用日志。

3.自适应哈希索引

哈希是一种非常快的查找方法。官方的数据是,使用自适应哈希索引后,读取和写入数据可以提高2倍,对于辅助索引的的链接操作,性能可以提高至5倍

    原文作者:mysql
    原文地址: https://blog.csdn.net/zhaozonglu/article/details/49966231
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞