二、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
- 3301: [USACO2011 Feb] Cow Line
- SQL Server 索引和表体系结构(包含列索引)
- TiDB 源码阅读系列文章(七)基于规则的优化
- 博弈论入门之nim游戏
- 1477: 青蛙的约会
- 2045: 双亲数
- 树莓派常用文本编辑器
- BZOJ1299: [LLH邀请赛]巧克力棒(Nim游戏)
- 2301: [HAOI2011]Problem b
- mysql相关命令
- mac python3 安装 mysqlclient包失败如何解救
- SQL Server 深入解析索引存储(上)
- 1475: 方格取数
- python3 将字典,列表等转换成字符串形式存入mysql数据库并复原成字典,列表(处理稍复杂的格式)
- 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 数组属性和方法
- 关于ConcurrentHashMap的key和value不能为null的深层次原因
- How does InnoDB behave without a Primary Key(11.InnoDB在没用主键情况下的行为)
- 输入示例,自动生成代码:TensorFlow官方工具TF-Coder已开源
- 聊聊java8中的@sun.misc.Contended与伪共享
- InnoDB Tidbit:The doublewrite buffer wastes 32 pages (512 KiB) (12.双写缓冲区会导致512KB的浪费)
- 10 | Tornado源码分析:Gen 对象(上)
- springboot使用spring-cloud-starter-alibaba-sentinel导致响应变成xml格式
- 内网安全攻防之内网渗透测试基础
- CMake脚本中如何修改XCode工程属性?
- 数值微分|有限差分法的误差分析
- Odyssey
- 【MySQL】之join算法详解
- 性能最佳实践:查询模式和分析
- Node 如何在 Controller 层进行数据校验
- FlutterDojo设计之道——状态管理之路(二)