链接:03-存储引擎-I [中文讲解] CMU-15445 数据库内核_哔哩哔哩_bilibili 英文版: 03 - Database Storage 1 (CMU Intro to Database Systems / Fall 2022) - YouTube
笔记:
仅做个人笔记记录知识点
存储。
最底层:Disk Manager 管理存储;本节课重点
- DBMS的primary的存储需要是非易失的磁盘。DBMS被操作的时候需要被加载到内存中;DBMS的存储模块要管理数据从磁盘到内存中的流动等操作;
- 存储介质:Network Storage、 HDD(本地磁盘)、SSD、DRAM(内存)、CPU caches(缓存)、CPU registers(寄存器);越来越贵,越来越快。数据往往也不是每层都经过的。同时分界线DRAM和SSD之间,往上易失,往下不易失;往上可随机访问,可按字节取值,往下非易失,一般是顺序访问,以块存储和取值和操作。
3.DRAM 内存,往下即为硬盘,DRAM之上为CPU的。新型存储:Non-volatile Memory, 非易失内存:速度较快,断电不丢,非常昂贵。
4.Tape Archives:类似磁带,容量大,存取时间慢,主要用来存档用,最不容易损坏。根据各种存储介质的存取时间说明,数据库不能时时刻刻都在硬盘上存取操作。
5.连续存取比随机存取要快很多,随机有查找时间。对于数据库而言:用户的存取方式一定是随机存取,所以要求我们把用户的随机存取连续的写入硬盘(考验数据库)。
6.page、block
7.好存储引擎:要求突破存储限制,允许用户在内存里管理巨大数据库(内存页的替换策略)。小心的管理数据的存取,不要让数据库过多的经常性的读取磁盘。随机读写磁盘要比顺序慢,尽量把随机的转换为顺序的。
8.大多数数据库都是面向硬盘的,都是存储在硬盘的。Redis是内存数据库(高速缓存,存储在内存中,断电易失)。
9.数据库的数据在硬盘中的存在形式都是文件。文件分页,一开始有一个目录(directory),每一个页都有固定大小,每页都有header对数据进行解释。
10.硬盘上面是内存,内存有限,buffer pool会选择把硬盘的页读取到内存中,运行。内存会先加载目录,再把需要的页导入内存,再交由执行引擎去做:
-
Why not use the os? 虚拟内存,物理内存,虚拟内存和物理硬盘一样大小,减少了,物理内存读入目录页来查找所需页,但是也有一定的问题? DBMS可以做的比OS要好: flushing dirty pages to disk in the correct order(行脏了之后,需要存回去,何时存入?立即存入还是等一组存入,这个需要DBMS自己控制,否则DBMS性能会很差) specialized prefetching(预先取出,例如全表扫描,预先取出后几个块,便于DBMS操作) buffer replacement policy(数据的替换需要DBMS自己管理) Thread/process scheduling(多线程需要DBMS自主控制) conclusion:OS is not your friend
-
数据库的文件存储问题,数据库如何管理数据在磁盘和内存两者之间的流动;静态表现,动态调度
13.静态表现:File Storage、page layout(布局)、tuple layout
14.File storage:DBMS把用户数据存在磁盘的一个或者多个文件里,文件内容对于OS而言不知也不管。 通常文件类型是数据库专有的。 storage manager:管理数据存储的文件,文件存储位置。假设文件只存储tuple Database pages:page是包含固定大小的block,page会被给定一个id,有目录结构记录page的位置。数据库也有页面的概念(三个页面,物理页面,OS页面,数据库页面),数据库取页面时都只能从物理页中取各自规定大小(例如oracle:4KB,SQLserver:8KB)的页面
15.page storage 结构 堆文件组织结构,tuple没排序,可以放在任何位置,存储随机顺序的页面集合,包含获取,创建,写入,删除一个页面的操作,支持迭代页面
如果只有一个文件,利用offset寻找页面
- page directory目录 类似于一个哈希表,目录指定页面位置(slot),多个文件和页面时,由目录结构告诉我们哪里去寻找页面和数据
17.每个页面都有一个header:包含内部数据信息
18.page layout(布局) 页面存储tuple的两种基本方法:面向tuple的和面向Log-struct的; 如何存储tuples?slotted pages(槽式页面);slot数组将“slots”映射到元组的起始位置偏移量,找一个数据时,只需要知道page id和slot array,通过page id查询array得到真实页面的offset。slot array从头往后添加,tuple从后往前增加,两者均不能增加时,页满。同时说明:slot array开始的位置存储着最晚slot使用的。
19.record ids
如何正确的识别元组,如何找到单个逻辑元组的物理位置,record id告诉我们如何寻找逻辑tuple对应的物理位置,一般是:page_id + slot/offset,对于PG而言,有0页 1 2 3个slot,若删除第二个slot则会剩下1 3,此时再insert tuple时,会insert into number 4 slot tuple。对于MySQL而言,会再insert into number 2 slot中。
postgres:
MySQL:
- tuple layout,每个元组都有一个header,header中有元数据,有bit map表示null值;tuple data:通常,一个页只存储一个表的数据,但是也有嵌入其他表数据的情况