关系表的数据组织
关系数据库在磁盘上的存储方式
存储对象:
如何表示数据库中的一个数据项?

不同数据类型采用不同存储方式
每个DBMS都有自己的数据类型系统(来源)
- 内嵌数据类型
- 用户自定义
数据类型:
- Scalar数据类型
- 复合数据类型
基础、很难搞对
数据类型:一组相同属性值的集合
- 型:类
- 值:对象
包括如下属性:
- 语法定义
- 合法输入(值域、格式)
- 输出
- 操作符、函数
- 内部存储:数据库大小
语法定义


如果是结构体,我们需要定义输入和输出的解析函数
内部存储
复杂的需要存储扁平化,节约空间

操作

字符类型需要注意

记录



pgsql不区分定长和变长。

元组内存结构

元组描述信息



一位一位地扣字节:32 = 15+15+2




更新:创建一个指针,腾出一个地方(溢出)

块是数据库最小的IO单位,数据库默认8K,操作系统一般4K
访问模式:
如果只访问几个元组,块不需要很大(OLTP)
如果一片一片地访问,块越大越好(OLAP16K-32K)
一个Block放不下怎么办:
- 元组一般不会跨页,可以拒绝
- 采用指针技术

大对象存储
- 存在数据库外
- 不保证访问准确性,不会备份(只会备份ID)
- 在内(BLOB,CLOB):
- 存在表内:数据较小
- 存在表外:数据库中单独存储,

大对象操作
一般用流来操作


Toast机制


数据非常大的时候依然不太优秀


02-索引的数据组织

数据结构

B树索引

B树

B+树



插入和删除
插入

删除

作业:实现B+树,实现索引
批量构建

B+树元组索引

所有数据都跟在这个结构后面


Hash索引

理想情况下Hash效率

动态Hash

类比Java线性表:每次增长四分之一,但是这里是翻倍
线性哈希

每次一个桶一个桶地涨
BitMap

索引

其他索引


