[原创]InnoDB体系结构
参阅:《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体系结构的更多相关文章
- Mysql Innodb体系结构
Innodb体系结构 Innodb存储引擎主要包括内存池以及后台线程. 内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据.缓存磁盘数据,修改文件前先修改内存.redo log 后台线程: ...
- 《Mysql技术内幕,Innodb存储引擎》——Innodb体系结构
Innodb体系结构 Innodb存储引擎主要包括内存池以及后台线程. 内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据.缓存磁盘数据,修改文件前先修改内存.redo log 后台线程: ...
- InnoDB体系结构
1.前言 整理了下InnoDB体系结构,方便以后更简单的理解 2.思维导图 参考: https://www.cnblogs.com/tangshiguang/p/6741035.html https: ...
- [小结]InnoDB体系结构及工作原理
参阅:<innodb存储引擎内幕>原创文章,会不定时更新,转发请标明出处:http://www.cnblogs.com/janehoo/p/7717041.html 一.概述: innod ...
- InnoDB体系结构学习笔记
后台线程 Master Thread 核心的后台线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括(脏页的刷新).合并插入缓冲.(UNDO页的回收)等 IO Thread 4个writ ...
- innodb 体系结构(后台进程)
一.后台进程(innodb 1.0.x以前的) 1.master thread master thread具有最高的线程优先级别,其内部由多个循环(loop)组成:主循环(loop).后台循环(bac ...
- Innodb的体系结构
MySQL的体系结构,两部分组成:MySQL的server层和存储引擎层. 存储引擎层innodb体系结构: innodb的整个体系结构就是由多个内存块组成的缓冲池及多个后台进程组成.我们可以从三方面 ...
- 第四课(1)——MySQL体系结构
学习目标 一.MySQL体系结构 二.MySQL内存结构 三.MySQL文件结构 四.Innodb体系结构 MySQL体系结构 一.MySQL体系结构图 1.Mysql是由SQL接口,解析器,优化器, ...
- InnoDB 存储引擎的线程与内存池
InnoDB 存储引擎的线程与内存池 InnoDB体系结构如下: 后台线程: 1.后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据: 2.另外,将以修改的数据文件刷 ...
随机推荐
- 练习使用markdown
我的随笔 写随笔的原因 1 完全是为了练习使用markdown编辑器 2 我是个爱学习的宝宝 3 学习能力问题? 随笔内容 弄懂markdown语法 随便谢谢心情 个人心情 冷漠 不想说话 神经 个人 ...
- Struts2第十篇【数据校验、代码方式、XML配置方式、错误信息返回样式】
回顾以前的数据校验 使用一个FormBean对象来封装着web端来过来的数据 维护一个Map集合保存着错误信息-对各个字段进行逻辑判断 //表单提交过来的数据全都是String类型的,birthday ...
- Spring-Struts2-基本集成
步骤: 1,导入struts2的相关jar包(检查是否有冲突的包,即同一个包有不同的几个版本存在) 2,导入struts2和spring的整合包 struts2-spring-plugin-2.3.4 ...
- mybatis-generato的功能扩展
项目代码地址:https://github.com/whaiming/java-generator 我在原有的基础上扩展了和修改了一些功能: 1.增加获取sqlServer数据库字段注释功能 2.Ma ...
- C++中const几中用法
转载自:http://www.cnblogs.com/lichkingct/archive/2009/04/21/1440848.html 1. const修饰普通变量和指针 const修饰变量,一般 ...
- Java基础——集合源码解析 List List 接口
今天我们来学习集合的第一大体系 List. List 是一个接口,定义了一组元素是有序的.可重复的集合. List 继承自 Collection,较之 Collection,List 还添加了以下操作 ...
- JSP入门 生命周期
我们之前使用的都是javax.servlet.http.HttpServlet,这个类实现了javax.servlet.Servlet接口,而这个接口中定义的三个方法是所有servlet都必须实现的. ...
- 洗礼灵魂,修炼python(3)--从一个简单的print代码揭露编码问题,运行原理和语法习惯
前期工作已经准备好后,可以打开IDE编辑器了,你可以选择python自带的IDLE,也可以选择第三方的,这里我使用pycharm--一个专门为python而生的IDE 按照惯例,第一个python代码 ...
- C - Coin Change (III)(多重背包 二进制优化)
C - Coin Change (III) Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- java人员正确使用IDEA 的方式
博主是Java开发人员,以前一直都用myeclipse来开发的,说实话感觉myeclipse毫无美感可言,后来经过同事介绍,认识了IDEA,一眼就相中了IDEA黑色的主题风格,自此就抛弃了旧爱myec ...