数据库系统架构
几个概念:
DBMS: 数据库管理系统(英语:database management system,缩写:DBMS) 是一种针对对象数据库,为管理数据库而设计的大型计算机软件管理系统。具有代表性的数据管理系统有:Oracle、Microsoft SQL Server、Access、MySQL及PostgreSQL等。通常数据库管理师会使用数据库管理系统来创建数据库系统。
RDBMS: 专门管理关系型数据库的管理系统
商用DBMS: Oracle,SQL Server,IBM DB2
开源数据库系统:MySQL,PostgreSQL
RDBMS的系统架构(单机)
成分说明:
- SQL Parser: SQL语句解释器;用于对用户输入的sql语句进行解析,检查语法错误,解析查询语义,生成 SQL 的内部表达:query plan(执行方案)。一般执行方案看起来如下:
- Query Optimizer: 估计不同的query plan的运行时间和空间代价;从多个query plan 选择最优的。
- Data Storage and Indexing:数据的存储和访问
- Buffer pool:在内存中缓存硬盘数据
- Execution Engine :根据query plan 完成相应的操作和运算
- Transaction management:事务管理,实现ACID要求。
数据存储与访问
数据库和文件系统的对比:
不同点:
- 文件系统:
存储文件
通用的
操作系统提供的服务
提供基本的API:open ,close - 数据库
存储数据包
专用的,专门指关系型数据
用户态程序
提供SQL接口
共同点:数据存储在硬盘;
数据库在磁盘中使用page为单位来存储一条条的记录record。每个page开始有一个page header,末尾有个slot槽。每个slot 槽都指示了page内的一条记录的偏移量。然后Tuple的存储结构是:
整个记录的总字节数-> 第一个变长字段偏移量->第二个变长字段偏移->定长字段内容->-----> 第一个变长字段值····
例如:
其定义为:
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));
那么每一条记录存储形式为:
第一个字节是总长度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是否相等,而不能比较那个大那个小。
哈希索引核心——链表哈希表:
对每条记录的key进行hash,然后把哈希结果挂到相应的哈希表。当hash链上的数据太多的时候,可以进行重新哈希。树索引的核心—— 树
B+树 其实就是平衡二叉树的扩展。存在两类节点:叶子节点和内部节点。其中叶子节点存放着记录的Key值。一个叶子节点就是一个PAGE,里面可能包含很多条数据。每条数据以(Key,ptr) 来存储。ptr 指向真实的记录id,通过这个id可以获取record的全部数据。一个page里面的key都是有序的。
内部节点是为了组织叶子节点而存在。
例如:
B+树的搜索:
B+树插入: