数据库系统架构

几个概念:

DBMS: 数据库管理系统(英语:database management system,缩写:DBMS) 是一种针对对象数据库,为管理数据库而设计的大型计算机软件管理系统。具有代表性的数据管理系统有:Oracle、Microsoft SQL Server、Access、MySQL及PostgreSQL等。通常数据库管理师会使用数据库管理系统来创建数据库系统。
RDBMS: 专门管理关系型数据库的管理系统
商用DBMS: Oracle,SQL Server,IBM DB2
开源数据库系统:MySQL,PostgreSQL

RDBMS的系统架构(单机)

户 数据库 架构设计_字段


成分说明:

  1. SQL Parser: SQL语句解释器;用于对用户输入的sql语句进行解析,检查语法错误,解析查询语义,生成 SQL 的内部表达:query plan(执行方案)。一般执行方案看起来如下:
  2. Query Optimizer: 估计不同的query plan的运行时间和空间代价;从多个query plan 选择最优的。
  3. Data Storage and Indexing:数据的存储和访问
  4. Buffer pool:在内存中缓存硬盘数据
  5. Execution Engine :根据query plan 完成相应的操作和运算
  6. Transaction management:事务管理,实现ACID要求。

数据存储与访问

数据库和文件系统的对比:
不同点:

  • 文件系统:
    存储文件
    通用的
    操作系统提供的服务
    提供基本的API:open ,close
  • 数据库
    存储数据包
    专用的,专门指关系型数据
    用户态程序
    提供SQL接口

共同点:数据存储在硬盘;

户 数据库 架构设计_字段_02

户 数据库 架构设计_字段_03


户 数据库 架构设计_字段_04


数据库在磁盘中使用page为单位来存储一条条的记录record。每个page开始有一个page header,末尾有个slot槽。每个slot 槽都指示了page内的一条记录的偏移量。然后Tuple的存储结构是:

整个记录的总字节数-> 第一个变长字段偏移量->第二个变长字段偏移->定长字段内容->-----> 第一个变长字段值····

例如:

户 数据库 架构设计_字段_05


其定义为:

create table Student (
ID integer NOT NULL, Name varchar(20), Birthday date,
Gender enum(M, F), Major varchar(20), Year year, GPA float,
primary key (ID));

那么每一条记录存储形式为:

户 数据库 架构设计_字段_06


第一个字节是总长度33个字节。第二个字节是Name整个变长字段对应的偏移量。

数据的顺序访问

例如:

select Name, GPA
from Student
where Major = ‘计算机’;
  • 顺序读取Student里面的每个page
  • 对于每个page,顺序访问每个tuple
  • 检查tuple是否满足条件
  • 对于满足条件的tuple提取其中的Name和GPA字段。

问题: 性能比较差,尤其是数据量大的时候,而所需的数据很少的时候。
例如存在100个系,我们只想过滤出其中的计算机系,那么顺序访问会遍历全部的数据。

有选择性的访问

使用索引即可避免顺序访问,达到有选择的访问。例如上面的例子中,如果我们对Major字段建立索引,那么我们可以直接定位到计算机系,而不用遍历所有的数据。

索引的类型:

  • Tree based index
  • Hash based index
    本质不同点:Tree based index是保序的,支持范围查找;Hash based index则是乱序的。这种不同是因为他们的实现原理不同而导致的。Hash based index因为对key进行了一次hash而使得哈希得到的结果只能反映原来的key是否相等,而不能比较那个大那个小。

哈希索引核心——链表哈希表:

户 数据库 架构设计_数据_07


对每条记录的key进行hash,然后把哈希结果挂到相应的哈希表。当hash链上的数据太多的时候,可以进行重新哈希。树索引的核心——户 数据库 架构设计_字段_08

户 数据库 架构设计_SQL_09


户 数据库 架构设计_数据_10


B+树 其实就是平衡二叉树的扩展。存在两类节点:叶子节点和内部节点。其中叶子节点存放着记录的Key值。一个叶子节点就是一个PAGE,里面可能包含很多条数据。每条数据以(Key,ptr) 来存储。ptr 指向真实的记录id,通过这个id可以获取record的全部数据。一个page里面的key都是有序的。

内部节点是为了组织叶子节点而存在。

户 数据库 架构设计_数据_11


例如:

户 数据库 架构设计_字段_12


B+树的搜索:

户 数据库 架构设计_户 数据库 架构设计_13


B+树插入:

户 数据库 架构设计_SQL_14