| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> InnoDB引擎架构 -> 正文阅读 |
|
[大数据]InnoDB引擎架构 |
1、架构总览2、Buffer Pool(缓冲池)介绍缓冲池就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。 在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“Fix”在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池,则称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。 对于数据库中页的修改操作,则首先修改缓冲池中的页,然后再以一定的频率刷新到磁盘上。 缓冲池中页默认大小为16K。 页从缓冲池中刷新回磁盘的操作并不是在每次页发生更新时触发,而是一种称为Checkpoint的机制刷新回磁盘。 2.1、Buffer Pool(缓冲池)的管理方式为了缓存管理的效率,缓冲池被实现为页链表;使用最近最少使用 (LRU) 算法从缓存中淘汰。即最频繁使用的页在LRU列表的前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表中尾端的页。 InnoDB对传统的LRU做了优化。在InnoDB的存储引擎中,LRU列表中加入了midpoint位置。新读取到的页,不会直接放入到LRU列表的首部,而是放到LRU列表的midpoint位置(默认为LRU列表长度的5/8处,参数 innodb_old_blocks_pct 控制)。同时为了避免全表扫描等非频繁查询操作,所产生的大量的页使得真正的热点数据被移除出LRU列表。故引入参数innodb_old_blocks_time,用于表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端。
2.2、名词解析LRU列表:管理已经读取的页 Free列表:可用的空闲页 FLush列表:管理脏页,被称为脏页列表。 LRU列表+Free列表+其他页(自适应哈希)= buffer pool size 在LRU列表中的页被修改后,称该页为脏页。 脏页既存在LRU列表,也存在Flush列表中。 3、Change Buffer介绍3.1、实现原理当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。 3.2、作用将更新等操作先记录在 change buffer,减少读磁盘,语句的执行速度会得到明显的提升。而且,数据读入内存是需要占用 buffer pool 的,所以这种方式能够避免占用内存,提高内存利用率。 3.3、容量Change Buffer默认占Buffer Pool的25%,最大设置占用50%: show variables like '%innodb_change_buffer_max_size%' 4、Log Buffer(重做日志缓冲)介绍4.1、Redo Log记录的内容redo log里记录了数据页的修改以及change buffer新写入的信息。 4.2、Redo Log Buffer和Redo Log File由于Redo Log File(重做日志文件)打开并没有使用O_DIRECT选项,为了确保每次日志都写入Redo Log File(重做日志文件),在每次将Redo Log Buffer(重做日志缓冲)写入文件系统缓存后,InnoDB存储引擎都需要调用一次fsync操作。 由于fsync的效率取决于磁盘的性能,因此InnoDB存储引擎允许当事务提交时,Redo Log可以先bu写入Redo Log File(重做日志文件),而是等待一个时间周期后再执行fsync操作,显然这可以显著提高数据库的性能。但是当数据库发生宕机时,由于部分日志未刷新到磁盘,因此会丢失最后一段时间的事务。
5、Change Buffer和Redo Log Buffer之间的联系5.1、记录的内容不同change buffer只是针对如果更改的数据所在页不在内存中才暂时储存在change buffer中。而redo log会记录一个事务内进行数据更改的所有操作。 5.2、产生的效益目标不同redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),而 change buffer 主要节省的则是随机读磁盘的 IO 消耗。 5.3、在内存中所处的位置不同Change Buffer属于Buffer Pool的一部分。Redo Log Buffer独立存在于Buffer Pool之外。 5.4、应用场景不同对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。 redo log 来实现 crash-safe 能力。 有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:23:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |