cmu15545-数据存储(Database Storage)
蓝图

数据库自己管理磁盘数据和缓冲区,而不是通过操作系统管理(Os is not your friend.)。
三层视图
数据库以页(page)为存储数据的基本单位,文件(file)是一系列页的集合,页中存储页数据(data),形成文件-页-数据三层架构。
文件有不同的组织形式,页包含页头和页数据,页数据可以采用不同方式组织:元组,日志,索引。
黄色部分为课程会提及的内容。

采用Heapfile进行文件存储时的执行图:

- 页目录:存储管理的页的元信息(空闲页,空页)
- 页头:存储页的元信息(页大小,校验和,数据库版本,事务可见性,压缩元数据)
面向元组的数据存储

通过<FileId, PageId, Slot>定位到一个指向tuple的指针(磁盘地址),然后找到tuple。
slot指针的灵活性:内部元组位置变化时,外部无感知;指针可以指向其他页,可以存储大数据(文件,大文本);支持变长记录。
数据库会为每个元组分配一个数据记录的唯一标识(record identifier),来表示元组的物理位置。SQLite和Oracle中为ROWID,Pg中是CTID,<PageId, Slot>。但是他们对于应用程序是无用的。

Header包含:可见性信息;NULL Bit Map。
Data包含:行数据。
Tuple只是一个字符串(char[]),本身不存储类型信息,类型信息存在数据库的System Catalogs中。(为了保证数据紧凑;非自解释的)
存数据时会遇到的问题:
- 数据对齐:填充,重排序

- 精确值问题:BIGDECIMAL(转为字符串存储)

空值:Bit Map;特殊值
大值和文件:Overflow Page和External File。
大值采用溢出页;大文件可以采用溢出页,也可以用外部文件系统存储,然后存储一个指向文件路径的指针,而不是直接存储文件内容(Oracle:BFILE, Microsoft: FILESTREAM)。


日志结构存储
基本概念:
- 利写不利读,非原地更新:只有PUT和DELETE操作,顺序IO。查询时由最新到最老时查询日志。
- 加速查询:索引。

- 加速查询:日志压缩,且压缩时会排序日志。
- 压缩方式:层级压缩,统一压缩

| 特点 | Level Compaction | Universal Compaction |
|---|---|---|
| 层级结构 | 有多层级,L0、L1、L2 等 | 无层级结构,所有文件在同一级别 |
| 文件组织方式 | 每个层级内文件不重叠,跨层逐渐下推 | 基于文件大小和数量合并,文件可能有重叠 |
| 合并策略 | 层级压缩,按顺序下推合并 | 文件数量和大小超过阈值时触发合并 |
| 写放大 | 较高,因为需要不断下推文件至更低层级 | 较低,因为减少频繁合并 |
| 读放大 | 较低,因为相同键在每层只存在一次 | 较高,因为没有严格层级,需检查多个文件 |
| 适用场景 | 读多写少的场景 | 写多读少、实时数据的高写入场景 |
索引组织存储
直接用索引组织数据,数据挂在叶子结点上,Page内部的tuple有序。
SQLite和MySQL默认用这种方式组织数据,Oracle和SQL Server可选。

和基于元组的存储对比:
| 特性 | Index-Organized Storage | Tuple-Oriented Storage |
|---|---|---|
| 数据与索引存储 | 数据存储在主键索引结构中 | 数据和索引独立存储 |
| 数据排序 | 数据按照主键顺序排序 | 数据无序存储 |
| 主键查询性能 | 高效,因数据已按主键排序 | 依赖主键索引,但数据本身无序 |
| 插入和更新性能 | 插入和更新时可能需要索引重排,较慢 | 插入和更新较快,无需主键排序 |
| 适用场景 | 主键查询频繁,数据顺序性强的场景 | 多种查询模式,插入和更新频繁的场景 |
cmu15545-数据存储(Database Storage)的更多相关文章
- web sql database数据存储位置
Q1: 数据存储在哪儿? Web Storage / Web SQL Database / Indexed Database 的数据都存储在浏览器对应的用户配置文件目录(user profile di ...
- 利用HTML5开发Android(7)---HTML5本地存储之Database Storage
在上一篇<HTML5本地存储之Web Storage篇>中,简单介绍了如何利用localStorage实现本地存储:实际上,除了sessionStorage和localStorage外,H ...
- 如何使用Iveely的数据存储引擎 Iveely Database
Iveely 数据存储引擎是为Iveely 搜索引擎提供数据存储的机制. 适用于:频繁数据插入.数据读取.数据更改或者删除数据不适合Iveely Database,存储结构是按照搜索引擎数据存储要求( ...
- External Storage 数据存储
一些数据存储的封装:http://hubingforever.blog.163.com/blog/static/17104057920129198236599/ External Storage数据存 ...
- 数据存储的两种方式:Cookie 和Web Storage
数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡,这个购物卡里存放了一些你的个人信息,下次你再来这个连锁超市时, ...
- 数据存储的两种方式:Cookie 和Web Storage(转)
数据存储的两种方式:Cookie 和Web Storage 数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡 ...
- Android开发7:简单的数据存储(使用SharedPreferences)和文件操作
前言 啦啦啦~大家好,又见面啦~ 本篇博文讲和大家一起完成一个需要注册.登录的备忘录的,一起学习 SharedPreferences 的基本使用,学习 Android 中常见的文件操作方法,复习 An ...
- Android数据存储(一)----SharedPreferences详解
一.Android数据的存储方式: Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File:此外还有一种网络存储 ...
- 基于 HTML5 的数据存储
以前想做个静态网页APP.最初的思路是用本地文件存储数据,后来发现在手机上运行时,文件无法找到. 经过了长达几个月的搜索(实际也就几天),没有找到合适的方法. 就在绝望的时候,无意间搜到基于HTML5 ...
- android 数据存储的几种方式
总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数 ...
随机推荐
- ARM汇编:MRS和MSR指令
1.MSR和MRS指令介绍 MRS 指令: 对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...
- 基于rabbitmq的事件总线
在这个微服务火热的时代,如果不懂一点微服务相关的技术,想吹下牛都没有法子.于是有必要了解学习一下.所以我最近看了下微服务相关的知识.微服务所涉及的知识是很广的,我这里只是讲一下事件总线,当然,有现成很 ...
- CANopen学习笔记(二)通讯对象PDO和SDO等
通讯对象 PDO 我的观点:一个 CANopen 设备可以拥有最多 512 个 RPDO 和 512 个 TPDO,总共最多 1024 个 PDO.(得到GPT4o的肯定) CiA协议栈观点:一个只有 ...
- Ubuntu 切换显示管理器
比较流行的显示管理器有: gdm3 - GNOME Display Manager lightdm - Light Display Manager sddm - Simple Desktop Disp ...
- Redis高可用方案:使用Keepalived实现主备双活
注意:请确保已经安装Redis和keepalived,本文不在介绍如何安装. 1.使用版本说明 Redis版本:5.0.2 Keepalived版本:1.3.5 Linux 版本:Centos7.9 ...
- docker高级篇:实战-自己开发的微服务怎么在docker上面运行?
通过前面的一系列学习,我们已经知道怎么制作dockerfile了.那么,本篇文章,咱们就把自己写的spring boot的demo项目,部署在docker上面. 案例目标: 我们自己开发的微服务怎么在 ...
- WSL2
Ref: Windows Subsystem for Linux Installation Guide for Windows 10 Windows Subsystem for Linux 2: Th ...
- 几步轻松定制私人AI助手
这两年大模型的发展持续火热,以至于许多资本和学者认为AI出现了泡沫,根本原因还是因为大模型目前还没有出现能够结合行业切实落地的应用. 我才不关注泡沫不泡沫呢,我只关注大模型能给我带来哪些帮助即可.大模 ...
- ubuntu 20.04安装GCC G++ 6.2,支持c++ 14
1. 下载源码包 wget http://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2 2. 解压 tar jxf gcc-6.2.0.tar.bz2 ...
- DOM & BOM – Input File, Drag & Drop File, File Reader, Blob, ArrayBuffer, File, UTF-8 Encode/Decode, Download File
前言 之前写过 2 篇关于读写文件和二进制相关的文章 Bit, Byte, ASCII, Unicode, UTF, Base64 和 ASP.NET Core – Byte, Stream, Dir ...