CMU-cs445:存储引擎

存储层次

  • tips:在数据库存储上尽量不要使用mmap,这会带来内存/并发等一系列问题,会成为系统瓶颈。

页式存储引擎


  1. a. 数据往往存储在以页为单位的空间中,页中包含元数据/索引/表数据,有的数据库将元数据和对应的表数据存放在一起,为了保证其他页丢失的情况下本页不受影响。
    b. 通常一页不会存放不同类型的数据,例如某页都是tuple,另一页全都是索引数据.
    c. 每个page会被赋予一个唯一的内部标识符,系统会生成属于page的ID.
    d. indirection层会吧page id映射到某个文件的某个位置(也就是记录一个相对位置,当文件整体移动后,使用相对位置+偏移量就能重新找到page)
    e. 物理页和操作系统页都在4kb左右,数据库的页在512b~16kb
  2. 管理页的方式
    a. Heap File Organization
    b. Sequential/sorted File Organization
    c. Hashing File Organization
  3. Heap File管理方式
    heap file是许多页的无序集合,有两种组织形式:链表和页目录
    • 链表管理就是定义两个链表,一个数据链表表示都是存满的数据页,另一个时空闲链表,用来新写入数据。
    • 页目录管理:使用一些特殊的页记录数据页page id和他的位置的映射关系,甚至可以记录页的剩余空间的大小。
  4. 页头(page header)
    • page size
    • checksum
    • DBMS version
    • transaction Visibility
    • 压缩信息
  5. 页内tuple布局
    • 长度固定方法:每个tuple固定长度
    • slotted pages:如下图所示,为了支持可变长度的记录作出的妥协。
  6. tuple布局
    • header:Visibility info(并发控制信息),Bit Map for NULL values.header并不需要存储数据的元数据,因为他们都是按顺序记录的。
    • record数据按定义时顺序写入

日志式文件布局

![](/images/db-3.png)
通过追加命令的方式记录信息,有点像redis的rdb模式
比较出名的有leveldb,基于leveldb,移除其mmap的rocksdb等。