[CMU15445] 04 - Database Storage 2
Log_Structured Storage
基于日志的存储比起原来的面向tuple的存储,只允许append新内容而不允许修改旧的内容,对于一个page来说,基于日志的存储就一直不断地append append的添加新内容,当日志大小超过一个page的大小,此时它便被写入磁盘。对于删除一个元素,就相当于将该元素的值置为一个已删除的标记。
比起tuple-oriented的存储,log-structure存储提高的写性能,主要原因如下:
- append only,使用顺序I/O代替了原来的随机I/O
- 所有写入的数据都是inmutable的
对于读来说,log_structure先从内存中的page开始寻找,如果没找到,就会从新到旧在磁盘上的page中寻找,为了避免这种linear scan,通常会维护存储元素的最新日志的索引,以便快速确定他在块中哪个位置。
因为不断地append,所以日志会变得越来越大,需要按照一定策略对这些文件进行合并,也就是对于一个相同的key,只保留它最新的一条log,这样merge结束后,一个文件中一个key就只有一个记录了,同时在merge的时候,会将key排序后merge,这样的数据结构叫做 Sorted String Tables (SSTables)
Data Representation
float/real vs numeric/decimal
数据库在存储数字时,如果要求精确就应该使用 decimal/numeric 这些类型,这些类型在底层并不是当作数字直接存储的,所以对他们做运算比较慢,而如果不要求很精确,就可以使用 float/real 类型,这些都是近似值但是运算起来很快。
large values
如果一个tuple的某个字段数据很大超过了一个页的大小,就需要另外存储这个字段,通常有两种方法,两者的区别在于数据是否由数据库直接管理:
- overflow pages
使用额外的溢出页来存储数据,原来字段的内容变成指向溢出页的指针
- external storage
数据存储在外部的文件中,原来的字段保存指向外部文件的uri,适用于很大的文件,例如视频,很长的文章等,缺点是这个文件并不由数据库管理,会有concurrence等问题