本文翻译自Coding-Geek文章:《 How does a relational database work》。算法
原文连接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies数据库
先翻译快速缓存章节。兴许有时间再翻译其余章节。缓存
翻译内容在原文的文件夹:
markdown
所以,数据库必需要有一个很是强大的数据缓存系统。网络
本章。咱们将看一下关系数据是怎样解决这两个问题的。数据结构
咱们不会探讨数据库是怎样从磁盘载入数据的。这个不是本文的重点(受篇幅所限,不展开分析)。post
为了提高性能,现代数据库都使用了快速缓存。性能
数据查询器从Cache Manger中获取数据。而不是直接从磁盘文件里读取数据。google
Cache Manger管理着一片内存区域。叫缓存池。 直接从内存获取数据,使得訪问数据库的性能日新月异。.net
但是,很是难评估使用快速缓存的重要性有多大,这取决于你要作什么样的数据库操做。
以及数据库使用的是什么样的磁盘
但是,我敢说使用内存快速缓存比不适用缓存直接从磁盘读数据快100到10万倍。
这也致使另一个问题(所有的数据库都有这个问题……), 快速缓存器需要在查询器訪问数据以前预取数据,不然查询器需要挂起,等待快速缓存器把数据从磁盘载入到内存先。
问题的核心就在“数据预取”。
数据查询器清楚需要哪些数据,因为它了解每一次查询操做的详细要求,也清楚数据库表的存储结构。数据预取的基本逻辑是这种:
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是这种。
LRU的意思是非近期当前使用。这个算法的是基于这样一种假设:近期使用过的数据,在未来被再次使用的几率很是大,需要驻留在缓存中。反之,非近期当前使用的数据可移除。
举个样例说明它的工做原理。这个简单的演示样例中缓存池能容纳3个数据。
因为缓存已满,需要先移除一条数据。移除哪一条?
依据LRU原则,1是最远当前使用的数据,移除1后增长9。
算法OK。但有一些限制,假设读取的是一张大表呢? 换言之。读取的表数据太大,超过了缓存空间的大小。使用该算法将清除缓存以前所有的数据,即便新载入上来的这张大表数据仅仅会使用一次就再也不使用。
为解决问题。一些数据库管理系统加了一些特殊规则。好比:Oracle规则说明:
对于超级大表的读取,直接从磁盘文件里读取数据。避免是用快速缓存。对于中型表。可以从磁盘文件直接读也可以用缓存。假设使用缓存应该把读取的数据放到LRU列表末尾(这样,新增长缓存数据时将先把该表的数据移除)。
LRU算法有高级版本号,叫LRU-K。好比SQL Server使用的LRU-K, K=2。
K表明的是考虑近期时间段,数据訪问的次数。
前面的样例是LRU-K算法最简单的样例。仅仅考虑一次訪问。K = 1。LRU-K的原理例如如下:
权值的计算是很是耗资源的。这也是为何 SQL Server使用K=2的缘由。这种设置方式。投入产出比較高。
想更深刻的了解LRU算法,可以參考一下算法文档(文档google)。
另外一些其余算法策略,用于管理快速缓存器。
一些数据库赞成你使用除默认算法外的其余算法。多种方式可选。
前讨论的最多的是读缓存器。它在数据使用以前将其提早载入到内存。数据库中还存在一种写缓存器,它将屡次操做改动的数据存储累计起来,一次写到磁盘文件。减小对磁盘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