CMU 15445 4. 缓存层

这章我们会重点来讲,dbms 是如何来管理他的内存,使得页在disk 和 内存间切换。

空间控制:
→在磁盘上写入页面的位置。
→目标是将经常使用的页面保持在尽可能靠近磁盘的物理上。

时间控制:
→何时将页面读入内存,以及何时将页面写入磁盘。
→目标是最大限度地减少必须从磁盘读取数据的停顿次数。

meta data 分为2部分,一个是dirty flag, 另外就是pin count

当一个线程在读该页的时候,就会记录下pin count+1。

image.png

当有一个线程需要写page table的时候,需要加一个latch。


image.png

这里我来讲一下 lock 和 latch 的区别,这2个术语是在dbms里的特指。广义上他们是一个东西。但为了区分os的锁,和db的锁。所以在dbms里分为2个词汇。

Lock

•保护数据库逻辑内容免受其他事务的影响
•持有直到事务结束
•需要支持回滚
•保护元组(行),表,索引

Latch

•保护DBMS内部数据结构的关键部分不受其他线程的影响
•持有直到一个操作结束
•不需要支持回滚

page table VS page directory

page directory页面目录是从数据库文件中的页面ID到页面位置的映射。
→必须将所有更改记录在磁盘上以允许DBMS在重新启动时查找。

page table页表是从页面ID到缓冲池帧中页面副本的映射。
→这是内存中的数据结构,不需要存储在磁盘上。

buffer pool

缓冲池是从磁盘读取的页面的内存缓存。 DBMS总是知道得更多(从query plan),所以想要自己管理内存和页面

它是一个由固定大小页面数组组成的内存区域。 每个数组条目称为一个帧(frame)。 当DBMS请求页面时,将精确副本放入其中一个帧中

缓冲池维护的元数据:
•页表:内存中的哈希表,用于跟踪当前在内存中的页面。
•Dirty-flag:当线程修改页面时需要设置(需要回写)。
•(pin-counter)引脚计数器:触摸该页面的线程数。

优化:
•多个缓冲池:DBMS还可以有多个缓冲池用于不同目的。 这有助于减少latch争用并改善局部性

•预取:DBMS还可以通过根据查询计划预先获取页面进行优化。 通常在按顺序访问页面时完成。


image.png

•扫描共享:查询游标可以附加到其他游标并一起扫描页面。


image.png

q2开始的时候,会先和q1一起扫


image.png

然后都扫完了,再补做开头的,这样就可以避免SEQUENTIAL FLOODING的问题。

缓存替换策略

LRU

最经典的缓存替换策略,最不经常使用的 就会被替换走。
也就是访问时间最旧的那个。

•维护上次访问每个页面的时间戳。
•DBMS选择使用最早的时间戳逐出页面。

时钟

LRU的近似,每页不需要单独的时间戳。
•每个页面都有一个参考位
•访问页面时,设置为1
使用“时钟指针”在循环缓冲区中组织页面
•扫描时检查页面位是否设置为1
•如果是,则设置为零,如果不是,则逐出
•时钟指针记住驱逐之间的位置


image.png

image.png

LRU和时钟替换策略的问题:

•LRU和Clock容易受到顺序泛洪的影响,其中缓冲池的内容由于顺序扫描而被破坏。
•由于顺序泛洪,LRU要替换的那个页面可能很重要。因为没有check 这个page是如何使用的,可能被误杀。

更好的方案:

•LRU-K:考虑最后K个参考的历史

3.1. 原理

LRU-K中的K代表最近使用的次数,因此LRU可以认为是LRU-1。LRU-K的主要目的是为了解决LRU算法“缓存污染”的问题,其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”。

3.2. 实现

相比LRU,LRU-K需要多维护一个队列,用于记录所有缓存数据被访问的历史。只有当数据的访问次数达到K次的时候,才将数据放入缓存。当需要淘汰数据时,LRU-K会淘汰第K次访问时间距当前时间最大的数据。详细实现如下:

  1. 数据第一次被访问,加入到访问历史列表;
  2. 如果数据在访问历史列表里后没有达到K次访问,则按照一定规则(FIFO,LRU)淘汰;
  3. 当访问历史队列中的数据访问次数达到K次后,将数据索引从历史队列删除,将数据移到缓存队列中,并缓存此数据,缓存队列重新按照时间排序;
  4. 缓存数据队列中被再次访问后,重新排序;
  5. 需要淘汰数据时,淘汰缓存队列中排在末尾的数据,即:淘汰“倒数第K次访问离现在最久”的数据。

3.3. 分析

LRU-K具有LRU的优点,同时能够避免LRU的缺点,实际应用中LRU-2是综合各种因素后最优的选择,LRU-3或者更大的K值命中率会高,但适应性差,需要大量的数据访问才能将历史访问记录清除掉。

•优先级提示:允许txns告诉缓冲池页面是否重要

•本地化(localization):根据每个txn /查询选择要逐出的页面

DBMS根据每个txn /查询选择要逐出的页面。 这最大限度地减少了每个查询对缓冲池的污染。
→跟踪查询已访问的页面。
示例:Postgres维护一个专用于查询的小型环形缓冲区。

如何处理脏页

FAST:如果缓冲池中的页面不脏,那么DBMS可以简单地“删除”它。
SLOW:如果页面是脏的,则DBMS必须写回磁盘以确保其更改是持久的。

DBMS可以定期遍历页表并将脏页写入磁盘。
当安全地写入脏页时,DBMS可以逐出页面或者只是取消设置脏标志。
需要注意的是,在写入日志记录之前,我们不会去写脏页

其他缓冲区

出了元祖和索引的缓存之外,还要很多别的缓存区
这些其他内存池可能并不总是由磁盘支持
→ Sorting + Join Buffers
→ Query Caches
→ Maintenance Buffers
→ Log Buffers
→ Dictionary Caches

总结

数据库系统需要实现自己缓存层,而不是复用os的,因为他知道的更多比操作系统。
可以在分配和驱逐上做出更好的决定,同时可以实现pre fetching。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,101评论 1 32
  • 第一章 MySQL 体系架构和存储引擎 mysql是数据库也是数据库实例 mysql 是一个单进程多线程架构的数据...
    snail_knight阅读 3,509评论 0 6
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,732评论 0 30
  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 790评论 0 3
  • lnnoDB是事务安全的MySQL存储引擎, 设计上采用了类似于Oracle数据库的架构。 通常来说,InnoD...
    好好学习Sun阅读 1,490评论 0 5