我们常说的“数据库”,比如“MySQL”、“Oracle”等,其实严格来说是DBMS(Database Management System),数据库只是一个存储数据着数据的仓库,而DBMS做的事是让我们能够操作数据库,比如解析SQL、DML等,都是DBMS在支持着。 在DBMS之下,又有着存储引擎,为DBMS提供数据增删改查的支持,不同的存储引擎提供不同的特性,负责组织数据的就是存储引擎。
一、数据的组织方式
1. 单条记录的结构
每一个字段都需要定义一个数据类型(DataType),数据类型在数据组织时的意义是确定数据长度,存储介质将会为其分配合适长度的空间。 每个字段被按照顺序组织起来,并且在开头存储着这一行的某些头信息(MetaData),例如记录总长度、时间戳等,这就组成了一条在硬盘上被存储的完整记录:
2. 多条记录如何被组织
行是一条具有完整意义的记录,被按照一定的规则,依次存储在文件中。 记录在文件中有以下几种主要的组织方法:
1. 堆文件
记录与记录之间没有顺序关系,每条记录可以存放在文件中的任何地方,只要想被存储的地址有足够空间。
2. 顺序文件
也就是遵循某个搜索码(Search key)的顺序,依次存储每一条记录。搜索码是一系列搜索条件的组合,可以是一个键,也可以是多个键组合。如下图,按照第二列,也就是姓名的顺序去决定记录的存储顺序:
3. 聚簇文件
前面提到的顺序文件是不同的表存储在不同的文件中,但是某些具体应用场景下,可能常常涉及多表查询,比如有一个名为Singers的表保存着歌手信息,又有一个名为Albums的表保存着每个歌手发布的专辑信息,如果你正在开发一个音乐播放器,那么涉及的场景一般都是需要找出某个歌手发布的所有专辑展示给客户,如果不同的表保存在不同的文件中,那么需要进行连接(Join) ,复杂度比较高,但是如果将每个歌手的专辑信息都在物理上存储在歌手信息之后,也就是两张表混合存放在同一个文件中:
4. 散列文件
散列文件完全没有顺序,每条记录应该存放的位置,是根据搜索码的Hash值决定的,因此插入删除都不涉及记录移动,且由于搜索码的Hash值直接决定了存储位置,所以查找符合特定搜索码的记录非常快,但是不支持范围查找与顺序读取。
3. 记录的读取
DBMS维护着自己的缓存空间,使用一些缓存置换算法尽量确保那些经常