仅做个人笔记
中文和英文的课都会看,中文看的是Moody老师的21年fall,英文是油管上的官方视频22年fall
tuple的物理存储(slotted pages)
slot 和 tuple。 slot是一个有序的相同大小的内容,slot上有指针指向相应的tuple,slot从前往后,pages从后往前
tuple一般而言存的是数据,但是也有存储log的
元组存储的是log
inserts delete updates 例如:
如果我们要访问一个数据的话,我们需要找到有关该数据的log,进行一遍回放。一般而言,是从后往前找的,找到该数据的insert,就知道最初的数据在此处诞生,然后再往后回放所有有关该数据的log,就能知道目前该数据是什么内容了。可以用索引来优化该过程,索引是 ** maps a tuple id to the newest log record** 。
log的数据库会非常冗余,效率很低,会选择周期性压缩日志,例如:两次update,会把前一次update变为无效。
压缩举例:
压缩为:
以下数据库大概在用存储log的数据库:HBASE、Cassandra、leveldb、rocksdb,一般适用于key-value数据库。 key-value数据库是唯一的,update对k-v数据库来说友好。
以下是英文课解释: 每个tuple是有一个ID的,它是唯一的,而它的内容就可以作为它的value,这样就构建了k-v数据库的主要的逻辑。
对于log数据库而言,只要存储在磁盘上,就是immutable(不可更改的)
log-structured 数据库 压缩: 两种:universal compaction 和 level compaction
对于分布式而言,log-s数据库较为友好。 所以log-structured数据库的缺点: write-amplification,
需要很多次的从物理磁盘的读写,一开始创建需要很多读写,在做压缩的时候也需要做很多读写
compaction is expensive
tuple storage
tuple是一个字节序列,不一定是连续的 DBMS的目录中,存储着表的模式信息,也就是对这些字节序列翻译成表的属性等信息
data representation
浮点型数据,有数据方面的问题:
(这个问题相对于银行而言,是很严重的问题,如果面临这样的业务,不可用浮点型)
数据库解决这个问题: 存储数据时转成字符串,例如PG:使用NumericDigit结构体
ndigits;位数;scale:数量级,10的多少次方;sign:符号;
MySQL:Numeric
如果测试数据存储类型时,可以使用两数相加,因为PG和MySQL都使用了自己定义的数据结构来存储浮点型数据,所以在相加时,得用自定义函数才可以。因此相比于整数相加,自定义的结构体相加比较耗时。
但是对于oracle来说,它自己定义的结构体,耗时很小,基本等同整形数据相加的时间。
Large Value
针对特长字符串:溢出页。 判断:PG : >2KB MySQL : > 1/2 size of page SQL Server : > size of page 根据上述判断,如果超出上述size,则将该内容重新找一个页存储,不改变之前页内容结构。
大值:外部文件。存储外部文件的地址在数据库中,但是别的软件可能会修改该文件,导致数据改变。
系统目录 system catalogs
DBMS会存储以下内容在system catalogs: tables,columns,indexes,views Users,permissions Internal statistics
几乎所有数据库都会DBMS自己管理catalogs,可以是另一个表。
information_schema:获取DBMS的catalogs,会出现一些表,这些表里存的就是有关catalogs的内容。
conclusion:
日志结构是一种面向界面架构的另一种存储方法; 存储管理并不是完全独立于DBMS的其他部分;
2021 fall 中文课程剩余部分:
DATABASE WORKLOADS
On-Line Transaction Processing (OLTP)
事务(交易)处理。是一些快速的操作,读写数据量很小的元组每次。保证要快,同时每次读写数据量比较小。是一个事务或者交易,高并发。
On-Line Analytical Processing(OLAP)
在线分析处理。一般公司本身在用,例如统计。SQL语句可能比较复杂,可能要读大量数据。
Hybrid Transaction + Analytical Processing
上述两者的混合
OLTP和OLAP的特性:
一般公司而言,是将OLAP和OLTP分开的。
N-ary storage model(NSM)
行存。 适合事务型数据库 进行分析性语句的时候,如果要筛选某一列的话,但是也需要将整行都取出,其余列就是useless data了。 对于插入和删除而言是有利的。
Decomposition storage model(DSM)
把数据拆开存储,列存。不同页存储不同的列。 对于分析型数据库有利。取某一列的时候,比较方便。只需存几个列就行。 取某一行的时候比较困难:(或者更新删除时,比较耗时)
2010年以后,市面上的数据库都会做一个列存的版本