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

    1. 本周学习总结 **学会使用码云管理代码,包括将本地的代码上传至码云,和将码云上的项目保存至本地.编程要掌握重要的类名的使用,提高编程效率,避免想无头苍蝇一样** 2. 书面作业 使用Eclips ...

  2. We Talk -- 团队博客

    WeTalk --在线群聊程序 团队博客 服务器一直在运行,使用客户端可直接登入使用.(做得很粗糙...) 客户端下载(java环境下直接运行) 0.项目介绍 现在我们网上交流离不开微信和QQ,当然在 ...

  3. HTML结构

    HTML:超文本标记语言. 可以放除了文本之外的内容,像图片.音频.视频等 由很多标签组成 html基本结构: <html> <head> 头标签存放网页信息,编码格式等 &l ...

  4. POJ--3258 River Hopscotch (最小值最大化C++)

    River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15273   Accepted: 6465 ...

  5. linux(3)磁盘与文件系统管理/查看硬盘、内存空间/文件系统的操作/ 文件的压缩和打包

    一.磁盘与文件系统管理 1.分区与文件系统分区:记录每一个分区的开始柱面和结束柱面主引导区(master boot recorder):记录分区的数据,记录硬盘里所有的分区信息分区划分好后,要将分区格 ...

  6. Hibernate table schema 的设置与应用

    hibernate在实现实体映射时,DB无需强行指定.部署时会较对DB户名和密码,根据用户名以访问的表完成实体映射.如果一个帐号可以访问一个数据库的下多个表,以oracle为例用户user1下面有表t ...

  7. 三、js的函数

    三.函数 函数是定义一次但却可以调用或执行任意多次的一段JS代码.函数有时会有参数,即函数被调用时指定了值的局部变量.函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值. 1.函数声 ...

  8. 记一次Linux下JavaWeb环境的搭建

    今天重装了腾讯云VPS的系统,那么几乎所有运行环境都要重新部署了.过程不难懂,但是也比较繁琐,这次就写下来,方便他人也方便自己日后参考参考. 我采用的是JDK+Tomcat的形式来进行JavaWeb初 ...

  9. Huge Mission

    Huge Mission Problem Description Oaiei is busy working with his graduation design recently. If he ca ...

  10. 机器学习实战K-近邻算法

    今天开始学习机器学习,第一章是K-近邻算法,有不对的地方请指正 大概总结一下近邻算法写分类器步骤: 1. 计算测试数据与已知数据的特征值的距离,离得越近越相似 2. 取距离最近的K个已知数据的所属分类 ...