一.数据库的存储层次与系统设计目标
1.存储层次架构
五级存储层级(由近及远、由快到慢)
1. 寄存器(Reg)
CPU 内置,速度最快、容量最小(字节级),CPU 直接运算使用,延迟<1ns。
2. 高速缓存 Cache(L1→L2→L3)
CPU 片内缓存,KB~MB 级。
L1/L2:单核心私有,速度快;
L3:多核共享,容量更大、稍慢。
作用:缓存热点数据,减少内存访问,延迟几~几十 ns。断电数据丢失。
3. 主存(RAM 内存)
主板内存条,DRAM 介质,GB~TB 级。程序运行的核心载体,CPU 仅直接读写缓存 / 内存,延迟 60-120ns。断电数据丢失。
4. 外存(SSD/HDD)
持久化存储,TB 海量容量、价格低廉,断电保留数据。
SSD(闪存):微秒级延迟,速度快;
HDD(机械盘):毫秒级延迟,速度慢。
5. 远程云存储
NAS、网盘等,受网络限制,速度最慢,用于海量数据归档共享。
核心思想:速度越快 → 容量越小 → 单价越高;速度越慢 → 容量越大 → 单价越低。
- 易失性(断电丢失):寄存器、Cache、内存
- 非易失性(断电保留):SSD、HDD、云存储
1.为什么数据库采用多级存储?
为了综合利用不同存储介质的速度和容量特点,在降低成本的同时提高数据访问效率。2.为什么数据库按页读取?
磁盘随机访问代价高,一次读取一个数据页可以减少I/O次数。3.既然有内存(RAM)了,为什么还要设计寄存器和高速缓存?直接用内存不行吗?
答:CPU运行速度远远快于内存,如果没有寄存器和高速缓存,CPU会经常“等数据”,导致计算机性能大幅下降。
2.数据库系统设计目标
由于内存容量有限、磁盘 I/O 缓慢,数据库系统设计目标:能够管理超过内存大小的数据,通过缓冲区减少磁盘读写,并充分利用磁盘顺序访问高效的特性,尽可能规避开销巨大的随机 I/O。
内存速度快但小;磁盘容量大但是慢,数据库所有存储层设计,都是为了弥合两者速度差距。
3.数据库磁盘上的组织方式
数据库按照:数据库,文件,页,记录,字段进行组织。
4.DBMS和操作系统的区别
DBMS和操作系统都是资源管理软件
操作系统负责管理计算机硬件资源,DBMS负责管理数据资源
整体位置关系:用户→应用程序→DBMS→操作系统→硬件
例如打开一个购物APP:购物APP→数据库(MySQL)→Windos,Linux→硬盘,CPU,内存
为什么数据库不直接使用操作系统管理文件?
数据库需要针对数据查询、索引、事务、缓存等进行专门优化,而操作系统只能提供通用资源管理。
二.数据库页核心设计
1.页的概念
页是磁盘与内存交互的最小单位,操作系统不能只读一行数据,每次读写必须一次性读取 / 写入一整页。
页的大小通常是固定的,但是不同数据库系统、不同存储引擎的页大小可能不同。
(类比:一本书里的一页纸,看书最少翻一整页,不能只看半行文字。)
2.三类页概念
硬件页,数据库页,操作系统页不是同一个东西,三者位于不同层次,大小和作用都不同。他们都是为了提高存储访问效率而设计的“数据管理单位”。
整体关系:数据库页→操作系统页→硬件页→磁盘扇区
(1)硬件页:解决如何高效访问存储设备
硬件页是由存储设备或硬件层定义的数据管理单位。它关注的是:硬件如何组织和读取数据
传统磁盘最底层单位:盘片→磁道→扇区(扇区是磁盘最小的物理读写单位)
作用:硬件不可能一次只读取一个字节。因为定位成本高,磁头移动耗时,控制复杂。所以硬件规定:一次读取一个固定大小的数据块
(2)操作系统页:解决如何高效管理内存
操作系统页是操作系统管理内存的基本单位。
操作系统负责:CPU→内存RAM→程序
操作系统页主要解决的问题:1.内存管理 2.虚拟内存
(3)数据库页:解决如何高效组织和查询数据
数据库页是DBMS管理数据存储的基本单位,数据库不直接管理每条记录,而是管理由多个记录组成一个Page
为什么数据库需要自己的页?
因为操作系统并不知道数据库的组织结构
3.为什么需要页
原因1:磁盘随机读写速度极慢,如果每次只读取一行数据,来回访问磁盘开销巨大。
把多条行数据打包放进一个页里:
查任意一行,整页载入内存,批量读写,大幅减少磁盘 IO 次数,提升数据库速度。
原因2(空间局部性原理):如果一个数据刚被访问,附近的数据也可能马上被访问,所以也要缓存,一次性读一页很划算
4.页的分区
页头:记录页码、前后页指针、空闲空间大小等页面基础信息
槽页:槽页是页内的 “目录区”,记录行数据的位置,用来快速定位行。
页目录:页内行数据的索引目录,快速定位某一行,不用逐行遍历
用户记录:存放一条条行数据(元组),包含隐藏列 + 自定义字段
空闲空间:留白区域,新增数据、删除回收的空间都放这里
页尾校验和:校验页面数据是否损坏
5.页的分类
硬件页
磁盘最小格子,512 字节,硬件固定规格,只能按格子读写。
操作系统页
系统把 8 个小格子拼成一个 4KB 盒子,内存磁盘交换统一用这个盒子,不用来回搬运细碎格子。
数据库页
数据库再把 4 个系统盒子拼成 16KB 大箱子。
一次搬一整箱,一箱装很多行数据,极大减少磁盘走动次数,提速读写。
设计目的逐层统一:打包小块数据,减少频繁磁盘访问
6.堆文件
堆文件:是一种无序的页面集合,其中的元组以随机顺序存储。堆文件就像“一个杂乱的文件柜”,里面的文件(页)没有固定顺序,随便放,找文件时需要看目录(页目录)。
存储特点:数据行毫无顺序堆放,没有排序规则、没有主键顺序约束。
写入:新数据直接追加到文件末尾,插入速度很快。
查询:无索引时只能从头到尾逐行遍历(全表扫描),查找很慢。
本质:无序的数据收纳堆,只适合频繁插入、极少按条件检索的场景。
为什么需要堆文件?
如果要求每次插入数据都排序,为了保持顺序,当数据量很大时效率会很低。所以数据库提供了一种简单的方式:当新数据来了,直接找一个空位置放进去,这就是堆文件。
三.元组布局
1.什么是元组?
元组就是关系表中的一行记录
2.元组有哪些特点?
- 元组是无序的
- 元组中的属性有顺序(每一个位置对应一个属性,不能随意改变属性顺序)
- 元组必须唯一(以为关系是集合,集合中不能有完全相同的元素)
3.元组和记录的区别
二者都表示“一行数据”,但二者的侧重点不同:
元组属于逻辑层,关注数据模型中的一行,数据的实际含义
记录属于存储层,关注数据在磁盘中对的存储形式