buffer pools 缓冲池
两个作用,一个是缓存用户的数据,另一个是缓存用户的更新
空间的控制,把经常在一起使用的数据放在同一个位置使用
时间的控制,什么时候读写内存,还要减少用户的等待时间
disk-oriented DBMS
内存比硬盘要小的多
研究的三个问题:
- buffer pool manager
- replacement policies 内存的替换策略
- other memory pools
frame
帧
locks or latches
- locks就是锁,逻辑上的锁
- latches具体的,底层的锁,也叫mutes
page table or pabe directory
- table是索引内存池中的页
- directory是索引磁盘中的页
global policies
全局策略
local policies
本地策略
DBMS是有很多缓冲池的
例如:
- 多个缓冲池实例
- 每一个数据库用缓冲池
- 每一个page用一个缓冲池
多个缓冲池可以降低锁的冲突
多个缓冲池的使用方式
- 方式1:
Object Id
记住数据去了那个缓冲池,
- 方式2:
hashing
去hash
- pre-fetching,提前判断要什么,直接给
- scan sharing 如果两个在同时读取一组数据,那就一起操作,但是如果有操作限制就有可能出错
- bypass 如果要扫描一大片数据的话,就不让这个进内存池了,因为这个东西是很少会需要的
os page cache
一般要绕过操作系统的缓存,因为是冗余的
替换策略:
两个问题,替换什么,怎么替换
least-recently used LRU
最近最少使用:
clock,这是一个模糊的LRU,就转圈,如果一圈之后都没有用的话就换了他
LRU
对遍历整个数据库是很费的,在有些工作的情况下,刚进来的那个页其实是最没用的页
LRU-K
, LRU
是记时间,LRU-K
记好多次访问时间,寻找规律,找到应该释放的那一页
localization
本地化,按照每一条语句去驱逐,把单独自己使用的驱逐,别人使用的不驱逐
priority hints
给进缓冲池的每个页一个优先级,按照优先级驱逐
dirty pages
我改了页,但是没有存储,这就会产生一个脏页(数据库和内存中是不一样的),所以当脏页产生的时候,不能清理内存池中的这一页,应该先写回内存,而后再清理,如果你感觉这一页以后用不到就直接写回硬盘,当然如果经常用到就不写回内存,一直使用
background writing
隔一段时间,就集中的进行刷脏
当然缓冲池中不一定只有数据库内容,可以将热点内容存住,日志,