参阅:《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. 201521123109《java程序设计》第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 作业参考文件下载 1.代码阅读:Child压缩包内源代码 1.1 ...

  2. 201521123089 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码1.1 com.parent包中Child.java文件能否编译通过?哪 ...

  3. 201521123080《Java程序设计》第1周学习总结

    #1. 本周学习总结 Java开发环境,如何用记事本和eclipse进行编程. #2. 书面作业 Q1.为什么java程序可以跨平台运行?执行java程序的步骤是什么?(请用自己的语言书写)      ...

  4. 201521123095 《Java程序设计》第1周学习总结

    1. 本周学习总结     开始了对JAVA的初步了解和学习,了解了如何编写简单的JAVA程序.      了解了Java的诞生及发展以及如何运用JVN JRE JDK      JVM让JAVA可以 ...

  5. JAVA课设 学生基本信息管理 团队博客

    1.成员 邹其元 网络1512 201521123060 杨钧宇 网络1512 201521123062 2.项目Git地址 团队项目码云地址 //添加截图 3. 项目git提交记录截图(要体现出每个 ...

  6. 201521123122 《java程序设计》第十二周学习总结

    ## 201521123122 <java程序设计>第十二周实验总结 ## 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将St ...

  7. lintcode.22 平面列表

    平面列表    描述 笔记 数据 评测 给定一个列表,该列表中的每个要素要么是个列表,要么是整数.将其变成一个只包含整数的简单列表. 注意事项 如果给定的列表中的要素本身也是一个列表,那么它也可以包含 ...

  8. python 实现登录程序

    本文介绍一个用python 实现的登录程序.python新手们可以参考一下. 用户信息存放于一个文件中,需要引入文件,校验输入的用户名.密码是否跟用户列表中的用户名密码相匹配,如果匹配,这登录成功,否 ...

  9. C++初学 virtual 相关

    声明: 1.为了节省篇幅,头文件和域什么的都没写.另外可能是java转C++,有些叫法可能会不对 2.因初学,都是自己摸索的,有错望指出,勿喷 假设父类声明 Parent.h中如下 class Par ...

  10. oracle pl/sql 变量

    一.变量介绍在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有:1).标量类型(scalar)2).复合类型(composite) --用于操作单条记录3).参照类型(refer ...