参阅:《innodb存储引擎内幕》

innodb整体的体系结构如下图所示: 

整体结构分两大部分:内存和进程
其中内存包括:buffer_pool\redo log buffer\additional memory pool
进程包括:master thread\io thread\purge thread\page cleaner thread

其中最主要的缓存buffer pool的构成如下图所示:

其中最主要的进程master thread的工作伪代码如下图所示:

Innodb 1.0.X

Innodb 1.2.X
if innodb is idle
  srv_master_do_idle_tasks();
else
  srv_master_do_active_tasks();
srv_master_do_idle_tasks();Innodb 1.0.x中每10秒的操作
srv_master_do_active_tasks();Innodb 1.0.x中每1秒的操作
同时对于脏页的刷新操作,从Master Thread线程分离到了一个单独的Page Cleaner Thread

checkpoint技术

对于脏页的刷新,innodb使用了checkpoint技术。

1.使用checkpoint技术的目的:

缩短数据库的恢复时间 ;
缓冲池不够用时,将脏页刷新到磁盘;
重做日志不可用时,刷新脏页;

2.LSN
Innodb通过LSN(log sequence Number)来标记版本
LSN是8字节的数字,其单位是字节。
含有LSN的对象:每个页、重做日志、checkpoints

3.刷盘形式
Sharp Checkpoint:将所有的脏页都刷回磁盘
Fuzzy Checkpoint:将部分脏页刷回磁盘

4.checkpoint条件
a.Master Thread Checkpoint(每秒或每十秒)
b.Flush_LRU_LIST Checkpoint(LRU列表空闲页<100,移除末端数据,若为脏页则刷盘-Page Cleaner)
c.Async/Sync Flush Checkpoint(重做日志不可用情况,0.75*total_redo_log_file_size<redo_lsn-checkpoint_lsn<0.9*total_redo_log_file_size)
d.Dirty Page too much Checkpoint(innodb_max_dirty_pages_pct)
e.数据库服务关闭

Innodb关键特性
插入缓冲
insert buffer(Change Buffer)的设计是为了提高非聚集索引的插入或更新效率;
操作对象是:辅助非唯一索引
流程:判断插入(更新、删除)的非聚集索引是否在缓冲池中,若在则插入;
若不在,则先放入到一个insert buffer对象中;
然后再以一定频率和情况进行insert buffer和辅助 索引叶子节点的merge操作;
两次写
redolog记录的是对页的物理操作,如偏移量800,写'aaaa'记录,如果这个页本身就已经损坏,再对其进行重做是没有意义的。所以,在应用重做日志前,我们需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是double write。

Innodb_dblwr_pages_written/Innodb_dblwr_writes<64/1

控制参数:innodb_doublewrite

异步IO
innodb使用异步IO子系统来对数据文件页进行预读和写请求。行为受到参数innodb_native_aio控制。在native AIO情况下,查询线程直接将请求发给操作系统,从而避免后台线程数量对并发数的控制。innodb后台线程只需要等待操作系统对IO请求的处理反馈信息。
控制参数:innodb_native_aio

自适应哈希索引
InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希所以可以带来速度的提升,则建立哈希索引,所以称之为自适应的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。哈希索引只能用来搜索等值的查询。
控制参数:innodb_adaptive_hash_index

刷新邻接页
当刷新一个脏页时,innodb存储引擎会检测该页所在区的所有页,如果是脏页,那么一起进行刷新。通过AIO可以将多个IO操作合并为一个IO操作,增大写入量,减少了物理写IO,所以这种工作机制在传统机械盘下有着显著的优势。
1.在写入次数基本不增加的情况下,增加了写入的量;
2.加速了脏页的回收;
3.充分利用double write每次写1M的特性;
4.这个功能打开以后发现iostat里面wrqm(合并写)这个值比较高;
控制参数:innodb_flush_neighbors

[原创]InnoDB体系结构的更多相关文章

  1. Mysql Innodb体系结构

    Innodb体系结构 Innodb存储引擎主要包括内存池以及后台线程. 内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据.缓存磁盘数据,修改文件前先修改内存.redo log 后台线程: ...

  2. 《Mysql技术内幕,Innodb存储引擎》——Innodb体系结构

    Innodb体系结构 Innodb存储引擎主要包括内存池以及后台线程. 内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据.缓存磁盘数据,修改文件前先修改内存.redo log 后台线程: ...

  3. InnoDB体系结构

    1.前言 整理了下InnoDB体系结构,方便以后更简单的理解 2.思维导图 参考: https://www.cnblogs.com/tangshiguang/p/6741035.html https: ...

  4. [小结]InnoDB体系结构及工作原理

    参阅:<innodb存储引擎内幕>原创文章,会不定时更新,转发请标明出处:http://www.cnblogs.com/janehoo/p/7717041.html 一.概述: innod ...

  5. InnoDB体系结构学习笔记

    后台线程 Master Thread 核心的后台线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括(脏页的刷新).合并插入缓冲.(UNDO页的回收)等 IO Thread 4个writ ...

  6. innodb 体系结构(后台进程)

    一.后台进程(innodb 1.0.x以前的) 1.master thread master thread具有最高的线程优先级别,其内部由多个循环(loop)组成:主循环(loop).后台循环(bac ...

  7. Innodb的体系结构

    MySQL的体系结构,两部分组成:MySQL的server层和存储引擎层. 存储引擎层innodb体系结构: innodb的整个体系结构就是由多个内存块组成的缓冲池及多个后台进程组成.我们可以从三方面 ...

  8. 第四课(1)——MySQL体系结构

    学习目标 一.MySQL体系结构 二.MySQL内存结构 三.MySQL文件结构 四.Innodb体系结构 MySQL体系结构 一.MySQL体系结构图 1.Mysql是由SQL接口,解析器,优化器, ...

  9. InnoDB 存储引擎的线程与内存池

    InnoDB 存储引擎的线程与内存池   InnoDB体系结构如下: 后台线程: 1.后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据: 2.另外,将以修改的数据文件刷 ...

随机推荐

  1. 201521123005《java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. ·继承(是什么,意义) -父类(被继承的类) -子类(继承父类) -多态(解决重复代码的问题 ...

  2. sublime text 按下Ctrl + B 显示空白的解决办法

    环境:windows xp , sublime text 2 条件:环境变量也已经设置好,可是无论怎么编译都是空白,如图: 于是鄙人百度之,发现不少网友都有这样的问题,但是网上给出的的解决方案千篇一律 ...

  3. 201521123056 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 1.1 答: ...

  4. 多线程面试题系列(2): CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  5. Hyperledger Fabric 1.0 从零开始(四)——Fabric源码及镜像文件处理

    2:Fabric源码及镜像文件处理 2.1下载Fabric源码 下载Fabric源码是因为要用到源码中提到的列子和工具,工具编译需要用到go语言环境,因此需要把源码目录放到$GOPATH下.通过1.3 ...

  6. Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了

    Python认为一切皆为对象:比如我们初始化一个list时: li = list('abc') 实际上是实例化了内置模块builtins(python2中为__builtin__模块)中的list类: ...

  7. Could not chdir to home directory /home/USER: Permission denied

    Could not chdir to home directory /home/USER: Permission denied  2 years ago davidzhang We changed t ...

  8. java基础知识4--数组的常用方法(Array)

    先说一个idea编辑器的问题,编辑器的光标变成黑色光标无法移动,按一下insert键就好了. 数组是线性数据存储结构.它用牺牲自动扩展大小来换取与集合相比的唯一优势--查询效率的提升.本身是一种引用类 ...

  9. 06jQuery-02-层级选择器

    因为DOM结构就是层级结构,所以我们经常要根据层级关系进行选择. 1.层级选择器 $('ancestor descendant'),选择祖先中的子孙,中间留空格: $('form[name=uploa ...

  10. 以下内容对于灵活修改textField中文本以及占位文本属性进行了完整的封装,加入项目中可以节约开发时间。

    textField对占位文本设置属性有限,在项目中需要改变占位文本的属性以及位置,需要自己对控件进行封装 封装方法如下: 在LDTextField.m 文件中: #import <UIKit/U ...