关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:《 How does a relational database work》。
原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies
先翻译快速缓存章节。兴许有时间再翻译其他章节。
翻译内容在原文的文件夹:
一、数据管理器
数据查询器运行查询操作,从数据表中获取数据。它向Data Manger发送请求,获取数据。当中存在2个问题:
- 关系型数据使用事物模型。当数据库在运行改动操作时,不能运行查询操作。避免查询出脏数据。
- 数据提取是最慢的数据库操作,由于数据要从磁盘上读取。
因此,数据库必须要有一个非常强大的数据缓存系统。
本章。我们将看一下关系数据是怎样解决这两个问题的。
我们不会探讨数据库是怎样从磁盘载入数据的。这个不是本文的重点(受篇幅所限,不展开分析)。
二、快速缓存器
正如我之前所言。数据库的性能瓶颈是I/O。
为了提升性能,现代数据库都使用了快速缓存。
数据查询器从Cache Manger中获取数据。而不是直接从磁盘文件里读取数据。
Cache Manger管理着一片内存区域。叫缓存池。 直接从内存获取数据,使得訪问数据库的性能突飞猛进。
可是,非常难评估使用快速缓存的重要性有多大,这取决于你要做什么样的数据库操作。
- 顺序訪问 VS 随机訪问。
- 读操作 VS 写操作。
以及数据库使用的是什么样的磁盘
- 7.2k/10k/15k rpm HDD
- SSD
- RAID 1/5/…
可是,我敢说使用内存快速缓存比不适用缓存直接从磁盘读数据快100到10万倍。
这也导致另外一个问题(全部的数据库都有这个问题……), 快速缓存器须要在查询器訪问数据之前预取数据,否则查询器须要挂起,等待快速缓存器把数据从磁盘载入到内存先。
三、缓存数据预取
问题的核心就在“数据预取”。
数据查询器清楚须要哪些数据,由于它了解每一次查询操作的详细要求,也清楚数据库表的存储结构。数据预取的基本逻辑是这种:
- 数据查询器在获取第一批数据时通知Cache Manger提前载入第二批数据到缓存中。
- 数据查询器在获取第二批数据时通知Cache Manger提前载入第三批数据,而第一批数据能够从缓存中移除了。
- …….
Cache Manger存储全部的数据在缓存池中。
为了确定缓存池中数据是否正在被使用,Cache Manger须要维护一些关于这些数据的额外信息(被称之为锁的东西)。
但有时。数据查询器不清楚下一步须要什么数据,或者数据库没有提供指定预取哪些数据的功能。取而代之,数据库提供的是随机预取功能(比如,查询了数据1,2,3后,它由于你可能还须要7,8,9,提前把7,8,9载入到缓存中)或者顺序缓存功能(运行一次查询后。将磁盘上查询数据临近的其他数据也预取到缓存中)。
为了评估Cache Manger预期机制工作的效果。现代数据库系统提供一个指标度量:缓存命中率。缓存命中率描写叙述查询器从缓存中拿到数据的几率(在不须要读磁盘文件的情况下)。
说明:糟糕的缓存命中率。并不总是意味Cache工作得不好。很多其他信息可參考Oracle说明文档。
可是,快速缓存内存大小是受限的。缓存内容须要不断吐故纳新。缓存数据的载入和移除都须要消耗磁盘I/O和网络I/O资源。
假设某个查询操作要常常运行,缓存数据频繁的载入和移除是非常低效的。为了解决问题。现代数据库都使用了一些缓存置换策略。
四、缓存置换策略
大多数现代数据库缓存置换策略都使用LRU算法,至少SQL Server, MySQL, Oracle and DB2是这种。
1. LRU
LRU的意思是非近期当前使用。这个算法的是基于这样一种假设:近期使用过的数据,在将来被再次使用的概率非常大,须要驻留在缓存中。反之,非近期当前使用的数据可移除。
为了方便理解,我们假设缓存中的数据未被加锁(因此可被移除)。
举个样例说明它的工作原理。这个简单的演示样例中缓存池能容纳3个数据。
- Cache Manger使用数据1后。将1放入缓存。
- Cache Manger使用数据4后,将4放入缓存。
- Cache Manger使用数据3后。将3放入缓存。
- Cache Manger使用数据9后。将9放入缓存。
由于缓存已满,须要先移除一条数据。移除哪一条?
依据LRU原则,1是最远当前使用的数据,移除1后增加9。 - Cache Manger使用数据4后放入缓存,4变成了近期被使用过的数据。调整顺序。
- Cache Manger使用数据1后放入缓存,1变成了近期被使用过的数据。3被移除。
- ……
算法OK。但有一些限制,假设读取的是一张大表呢? 换言之。读取的表数据太大,超过了缓存空间的大小。使用该算法将清除缓存之前全部的数据,即使新载入上来的这张大表数据仅仅会使用一次就不再使用。
2. 算法改进
为解决问题。一些数据库管理系统加了一些特殊规则。比如:Oracle规则说明:
对于超级大表的读取,直接从磁盘文件里读取数据。避免是用快速缓存。对于中型表。能够从磁盘文件直接读也能够用缓存。假设使用缓存应该把读取的数据放到LRU列表末尾(这样,新增加缓存数据时将先把该表的数据移除)。
LRU算法有高级版本号,叫LRU-K。比如SQL Server使用的LRU-K, K=2。
K代表的是考虑近期时间段,数据訪问的次数。
前面的样例是LRU-K算法最简单的样例。仅仅考虑一次訪问。K = 1。LRU-K的原理例如以下:
- 记录数据的近期訪问次数(最多记录K次)。
- 依据数据訪问次数,设置一个权值。近期訪问次数越多的权值越大。
- 当一批新的数据载入到缓存中时,权值大的数据不会被移除,即使该数据是非常早就载入到缓存中的。
- 假设数据长时间未被再使用,权值会逐渐减少。
权值的计算是非常耗资源的。这也是为什么 SQL Server使用K=2的原因。这种设置方式。投入产出比較高。
想更深入的了解LRU算法,能够參考一下算法文档(文档google)。
3. 其他算法
另一些其他算法策略,用于管理快速缓存器。
- 2Q(相似LRU-K算法)
- CLOCK(相似LRU-K算法)
- MRU(用得比較多的算法。逻辑相似LRU。用的是另一套规则)
- LRFU(近期、最频繁使用算法)
- ……
一些数据库同意你使用除默认算法外的其他算法。多种方式可选。
五、写缓存器
前讨论的最多的是读缓存器。它在数据使用之前将其提前载入到内存。数据库中还存在一种写缓存器,它将多次操作改动的数据存储累计起来,一次写到磁盘文件。减少对磁盘IO的频繁訪问(数据库瓶颈在I/O)。
谨记,快速缓存中存储的是分页数据而不是人们直观印象中的行数据。假设缓存中的某一页数据被改动了,还没有保存到磁盘上,这页被称为“脏页”。有多种策略算法能评估脏页数据写到磁盘上的最佳时机,而这也和事物强相关(事务是下一章节将展开的内容)。
已翻译的《How does a relational database work》其他章节链接:
1. 关系型数据库工作原理-时间复杂度:http://blog.csdn.net/ylforever/article/details/51205332
2. 关系型数据库工作原理-归并排序:http://blog.csdn.net/ylforever/article/details/51216916
3. 关系型数据库工作原理-数据结构:http://blog.csdn.net/ylforever/article/details/51278954
4. 关系型数据库工作原理-快速缓存:http://blog.csdn.net/ylforever/article/details/50990121
5. 关系型数据库工作原理-事务管理(一):http://blog.csdn.net/ylforever/article/details/51048945
6. 关系型数据库工作原理-事务管理(二):http://blog.csdn.net/ylforever/article/details/51082294
关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)的更多相关文章
- 关系型数据库工作原理-查询优化器(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- 关系型数据库工作原理-SQL重写(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- 关系型数据库工作原理-SQL解析(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-高速缓存(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-事务管理(一)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-数据库整体框架(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
随机推荐
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第六篇:拦截器
摘要 本文将对“MVC公告发布系统”的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 我们继续完善“MVC公告发布系统”, ...
- 分析器错误消息: 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分
关于错误提示:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决方案 不知怎么的,每次Win10升级后相应的注册器都恢复默认了,当我运行08版的asp项目时会报这个错. vs上的 ...
- amazeui学习笔记--css(常用组件6)--图标Icon
amazeui学习笔记--css(常用组件6)--图标Icon 一.总结 1.关注用法即可:在 HTML 上添加添加 am-icon-{图标名称} class. <span class=&quo ...
- ajax中打开新页面使用window.open方法被拦截的解决方法
$('.testA').unbind('click').bind('click',function(){ var result=""; $.ajax({ url:'http://l ...
- jquery中empty()和remove()的区别
empty 顾名思义,清空方法,但是与删除又有点不一样,因为它只移除了 指定元素中的所有子节点. remove与empty一样,都是移除元素的方法,但是remove会将元素自身移除,同时也会移除元素内 ...
- struts2_7_Action类中方法的动态调用
(一)直接调用方法(不推荐使用) 1)Action类: private String savePath; public String getSavePath() { return savePath; ...
- VMware Ubuntu安装具体过程
不是每个程序猿都必须玩过linux,仅仅是博主认为如今的非常多server都是linux系统的,而自己属于那种前端也搞.后台也搞,对框架搭建也感兴趣,可是非常多生产上的框架和工具都是安装在server ...
- vue项目实现导出数据到excel
实现导出功能分两种,一种是客户端拿到数据做导出,第二种是服务器端处理好,返回一个数据流实现导出 第一种网上很容易找到,也很好用,本文要说的是第二种. fetchExport({ id: this.so ...
- AdminLTE的使用(转)
官方文档link1.AdminLTE的必要配置文件<!-- Tell the browser to be responsive to screen width --> <meta c ...
- 在mac中导入hadoop2.6.0源代码至eclipse 分类: A1_HADOOP 2015-04-12 09:27 342人阅读 评论(0) 收藏
一.环境准备 1.安装jdk.maven等 2.下载hadoop源代码,并解压 3.将tools.jar复制到Classes中,具体原因见http://wiki.apache.org/hadoop/H ...