二、InnoDB存储引擎
2.3 InnoDB体系架构
1)后台线程
Master Thread:核心线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO页的回收等。
IO Thread:处理IO请求
Purge Thread:事务被提交后,其所使用的 undolog 可能不再需要,因此需要 PurgeThread 来回收已经使用并分配的 undo页。
2)内存
缓冲池:简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。
- 读取:在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页 'FIX' 在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在,直接读取。否则,读取磁盘。
- 修改:首先修改缓冲池中的页,再以一定频率刷新到磁盘(checkPoint机制刷新到磁盘 checkpoint机制)
缓冲池管理:LRU(最近最少使用)算法来管理
重做日志缓冲:将重做日志信息放到这里,然后按一定频率将其刷新到重做日志文件。
2.6 InnoDB关键特性
1)插入缓冲
对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个 Insert Buffer
中,好似欺骗。
数据库这个非聚集的索引已经插到叶子节点,而实际并没有,只是存放在另一个位置。然后再以一定的频率和情况进行 Insert Buffer
和辅助索引页子节点的 merge(合并)
操作。这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对于非聚集索引插入的性能。
然而 Insert Buffer
的使用需要同时满足两个条件:
- 索引是辅助索引(secondary index)
- 索引不是唯一的
2)两次写
3)自适应哈希索引
InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(adaptive hash index,AHI)。AHI是通过缓冲池的 B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。
AHI 有一个要求,即对这个页的连续访问模式必须是一样的。例如对于 (a,b) 这样的联合索引页,其访问模式可以是以下情况:
- where a=XX
- where a=XXX and b=XXX
访问模式一样指的是查询的条件一样,若交替进行上述两种查询,那么 InnoDB 存储引擎不会对该页构造 AHI。此外 AHI 还有如下的要求:
- 以该模式访问了100次
- 页通过该模式访问了N次,其中 N=页中记录*1 / 16
4)异步IO
用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完成后,等待所有IO操作的完成,这就是AIO。
5)刷新邻接页
:当刷新一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。
2.8 小结
本章对InnoDB存储引擎及其体系结构进行了概述,先给出了InnoDB存储引擎的历史、InnoDB存储引擎的体系结构(包括后台线程和内存结构):之后又详细介绍了InnoDB存储引擎的关键特性,这些特性使InnoDB存储引擎变得更具 '魅力';最后介绍了启动和关闭MySQL时一些配置文件参数对InnoDB存储引擎的影响。
通过本章的铺垫,读者在学习后面的内容时就会对InnoDB引擎理解得更深入和更全面。
原文地址:https://www.cnblogs.com/lhxBlogs/p/17658638.html
- log4net 中错误 System.Web.HttpException (0x80004005): 文件不存在
- Contact Manager Web API 示例[2] Web API Routing
- Python内置函数
- NET实现微信公共平台上传下载多媒体文件
- css3基础知识——回顾
- Contact Manager Web API 示例[3] 分页和查询(Paging and Querying)
- @font-face css3自定义个性化字体
- 你不知道的javaScript笔记(7)
- Contact Manager Web API 示例[4] 异常处理(Exception Handling)
- 你不知道的javaScript笔记(6)
- 创建支持多种屏幕尺寸的Android应用
- 封装多线程处理大量数据操作
- 你不知道的javaScript笔记(5)
- 无特性的 MEF 配置方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 3分钟短文 | Laravel模型获取最后一条插入记录的ID编号
- 3分钟短文 | Laravel 模型的get find first方法你分清咋用了吗?
- 3分钟短文 ! Laravel拼装SQL子查询的最佳实现
- 对java中的泛型的理解
- 解决elasticsearch集群Unassigned Shards无法reroute的问题
- 一次系统扩容引起的elasticsearch故障及恢复
- WPF SharpDx 性能优化方法
- java中的reference(四): WeakReference的应用--ThreadLocal源码分析
- 聊聊dubbo-go的availableCluster
- 删除排序链表中重复元素的方法
- java异常体系及1.7中的try-with-resources
- JAVA中的静态代理、动态代理以及CGLIB动态代理分析
- 基于centos7 搭建storm1.2.3集群过程
- JAVA中的浅克隆和深克隆分析
- mysql表占用多少磁盘空间以及清理表空间