[原创]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.另外,将以修改的数据文件刷 ...
随机推荐
- 201521123040《Java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...
- 201521123060 《Java程序设计》第12周学习总结
1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2.书面作业 将Student对象(属性:int id, String name,int age,double ...
- 跨站数据请求哪家强——青出于蓝的jsonp
/* * 跨站数据请求哪家强--青出于蓝的jsonp数据格式 * @author gj * @date 2017-09-15 */ 先哲有云"青,取之于蓝,而青于蓝:冰,水为之,而寒于水&q ...
- Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了
Python认为一切皆为对象:比如我们初始化一个list时: li = list('abc') 实际上是实例化了内置模块builtins(python2中为__builtin__模块)中的list类: ...
- Nim函数调用的几种形
Nim函数调用的几种形式 Nim 转载条件:如果你需要转载本文,你需要做到完整转载本文所有的内容,不得删改文内的作者名字与链接.否则拒绝转载. 关于nim的例行介绍: Nim 是一门静态编译型的系统级 ...
- python只re模块
while True: phone_number=input('please input your phone number:') if len(phone_number)==11 \ and pho ...
- 框架应用:Spring framework (二) - AOP技术
基础概念 线程中的方法栈 java程序虚拟机启动时会载入程序码,虚拟机会为每一条正在运行的线程生成一个方法调用栈,线程以方法运行为执行单位. AOP概念以及目标 AOP是面向切面编程,其实就是在不修改 ...
- MonoDeveloper 快捷键
注:环境是Unity3D 5.0.2f1自带的MonoDevelop Ctrl+X 剪切功能.另外,光标放在一行的任意位置(不选中任何内容),使用快捷键,将把这一行剪切并删除此行,这个特性非常好用 C ...
- ACM学习之路___HDU 1385(带路径保存的 Floyd)
Description These are N cities in Spring country. Between each pair of cities there may be one trans ...
- 利用Docker快速创建Nginx负载均衡节点
本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.Self-Host Kestrel 1. 在vs2017中新建dotnet core2. ...