CMU15-445:Lecture #04 笔记

Lecture #04: Database Storage (Part II)


本文是对CMU15-445课程第4节笔记的一个粗略总结和翻译。仅供个人(M1kanN)复习使用。


1. Log-Structured Storage

(也叫Append-only Sequence of Data) 参考: Log-Structured 结构

  • 与Slotted-Page Design有关的问题是:

    • Fragmentation:
      删除tuple会在page中留下空隙。

    • Useless Disk I/O:

      由于非易失性存储的block-oriented的性质,需要读取整个块来获取tuple。

    • Random Disk I/O:
      磁盘阅读器可能不得不跳到20个不同的地方来更新20个不同的tuples,这可能会非常慢。

    如果我们在一个只允许创建新数据而不允许覆盖的系统上工作呢?日志结构的存储模型与这个假设相配合,解决了上面列出的一些问题。

  • Log-Structured Storage: DBMS不存储tuples,只存储日志记录。

    • 将数据库如何被修改的记录存储到文件中(放入和删除)。每条日志包含tuples的唯一标识符
    • 要读取一条记录,DBMS会从最新的到最旧的逆向扫描日志文件,并 "重新创建 "这个 tuple。
    • 写的快,读的可能慢。磁盘写入是连续的,现有的页面是不可改变的,这导致了随机磁盘I/O的减少。
    • 在append-only的存储上工作得很好,因为DBMS不能回溯并更新数据。
    • 为了避免长时间的读取,DBMS可以有索引来允许它跳到日志中的特定位置。它还可以定期地压缩日志。(如果它有一个tuple,然后对其进行了更新,它可以将其压缩到只插入更新的tuple)。
    • 由于不再需要时间信息,数据库可以将日志压缩到一个按id排序的表中。这些被称为分类字符串表(SSTables),它们可以使tuple搜索非常快。
    • 紧凑化的问题是,DBMS最终会出现写入放大的情况。(它一次又一次地重写相同的数据)。

2. Data Representation

  • tuple的数据本质就是字节数组!DBMS要知道如何解释这些字节,来推导出属性的值。数据表示方案(data representation scheme) 是DBMS如何为一个值存储字节。

  • 有5种high level datatypes可以存储在tuples中:integer,variable-precision numbers,fixed-point precision numbers,variable length values, dates/times

    • Integers

      大多数DBMS使用IEEE-754标准规定的 "native "C/C++类型来存储整数。这些值是固定长度的。

      • 例子:
        INTEGER, BIGINT, SMALLINT, TINYINT.
    • Variable Precision Numbers

      这些是不精确的、可变精度的数字类型,使用IEEE-754规定的 "native "C/C++类型。标准规定的 "native "C/C++类型。这些值也是固定长度的。

      变精度数的运算比任意精度数的运算更快,因为CPU可以直接对其执行指令。然而,在进行计算时可能会出现精度损失!

      • 例子:
        FLOAT, REAL
    • Fixed-Point Precision Numbers
      这些是具有任意精度和比例的数字数据类型。它们通常以精确的、可变长度的二进制表示法(像一个字符串)来存储,并带有额外的元数据,这些数据将告诉系统诸如数据的长度和小数点应该在哪里。
      当误差不可接受的时候,DBMS就要付出性能的代价来提高精度。

      • 例子:
        NUMERIC, DECIMAL.
    • Variable-Length Data

      • 代表任意长度的数据类型。它们通常是用一个header来存储的,这个header可以追踪到字符串的长度,以便于跳转到下一个值。它还可能包含一个数据的校验和。
      • 大多数DBMS不允许一个tuple超过一个页面的大小。 但是!那些允许的系统将数据存储在一个特殊的 "溢出 "页上,并让tuple包含一个对该页的引用。这些溢出页可以包含指向其他溢出页的指针,直到所有的数据都可以被存储。
      • 有些系统会让你把这些大的数值存储在一个外部文件中,然后元组会包含一个指向该文件的指针。例如,如果数据库存储的是照片信息,DBMS可以将照片存储在外部文件中,而不是让它们占用DBMS中的大量空间。这样做的一个缺点是,DBMS不能操作这个文件的内容。因此,没有耐久性或交易 保护。
      • 例子:
        VARCHAR, VARBINARY, TEXT, BLOB.
    • Dates and Times
      不同的系统对日期/时间的表示方法不同。通常情况下,它们被表示为一些单位时间 (自unix时代的(微/毫)秒)。

      • 例子:
        TIME, DATE, TIMESTAMP.
    • System Catalogs

      为了使DBMS能够识别tuple的内容,它维护了一个内部目录来告诉它关于数据库的元数据。元数据将包含关于数据库有哪些表和列的信息,以及它们的类型和值的顺序。

      大多数DBMS将其目录以其表的格式存储在自己的内部。他们使用
      特殊代码来 "bootstrap "这些目录表。

posted @ 2022-12-25 15:40  M1kanN  阅读(106)  评论(0编辑  收藏  举报