15-721 chapter2 内存数据库

Background

随着时代的发展,DRAM可以容纳足够的便宜,容量也变大了。对于数据库来说,数据完全可以fit in memory,但同时面向disk的数据库架构不能很好的发挥这个特性

这张图是disk database的cpu instruction cost

 想buffer pool和logging这些开销完成可以在memory database中大幅度的下降

内存数据库的结构

存储结构

Index

同时index在内存中重建也很快,这样避免logging的额外开销。但是同时因为B+树没能利用好cache(现代cache和memory速度差异越来越大) ,性能提升也不是很大。

WAL

利用批量提交日志,同时也没有什么dirty page的概念,所以可以避免一些额外的开销比如track LSN

 

BottleNeck

disk的主要瓶颈是磁盘IO,那么内存数据库的瓶颈就多元化了。

并发控制 

一个原子的锁操作,就是如果相等的话,就设置为new value,如果不等的话,就不设置,返回值bool代表成没成功。

CAS(Compare and Swap)是一种在并发编程中用于确保原子性操作的技术,它可以避免多线程同时对同一数据进行修改而导致的数据不一致问题。

内存数据库通常使用CAS来实现乐观锁。因为内存数据库所有的数据都保存在内存中,读写速度非常快,可以快速地进行CAS操作。而且内存数据库通常不需要持久化数据到磁盘,所以也无需考虑磁盘I/O的开销。

相比之下,磁盘数据库的读写速度较慢,很难保证CAS操作的原子性。此外,磁盘数据库需要频繁进行磁盘I/O操作,而磁盘I/O的速度较慢,会影响数据库的性能。

因此,在磁盘数据库中,通常会采用其他方式来实现并发控制,如悲观锁、行级锁等。这些方法可以确保并发访问时数据的一致性,但可能会带来一定的性能开销

 2PL

二阶段锁有严格二阶段锁,就是为了保障一致性,在事务commit和abort阶段才进入锁shrinking阶段。

 两者都要可能死锁,要采取一些额外操作来监测,如背景线程,或者等待,自杀,杀别的事务

TimeStamp

就是每个record记录一个读写时间戳,然后read的话,看看是不是比写时间大,不然就 读到以前的数据。write的话,看看是不是比读写的时间戳大,如果不是的话,就过去的影响未来,应该abort.

OCC 

有三个阶段,复制数据到本地操作(一个额外的负担,所以occ性能不会太好,即便是理想冲突少的情况,然后如果大量冲突的极端情况下,会至少有一个提交,可能会性能不是那么难看),然后验证是否符合提交条件,然后才是写回,提交。更新record的时间戳。

 参考资料:

学习笔记:Staring into the Abyss - 知乎论文中文翻译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值