如何设计一个关系型数据库
如果在面试中面试官问了我们这样一道题,很多的面试者往往都会不知所措,因为要想很好的回答这道题要对数据库有很深的了解同时要对一些业务也有了解。首先这道题要回答的点太多了所涉及的知识面也不少。
下面看一个RDBMS架构图:
数据库由两个部分组成分别是存储(类似于一个文件系统)和程序实例(对存储进行逻辑上的管理)。
程序由以下八个部分组成:
- 存储管理:数据的逻辑关系转换为物理上的存储关系
- 缓存机制:优化存储效率
- SQL解析:将SQL进行解析
- 日志管理:记录操作
- 权限划分:进行多用户管理
- 容灾机制:进行灾难恢复
- 索引管理:优化数据查询效率
- 锁管理:使数据库支持并发操作
索引模块
1、为什么要使用索引?
全表扫描是最简单的方式,将整张表全部或分批次的加载进来,存储的最小单位是块或者页是由多行数据来组成的加载进来后逐个块去轮询找到需要的目标并返回这种方式效率非常的低下。(当只有少量数据时候这个时候效率会快)
为了避免扫描整张表引入了索引,索引灵感来自于字典,在字典中将关键的信息组织起来查询时候依据去指引就能查到想要的页面,使用索引能够加速查询效率。
2、什么样的信息能够成为索引
能将该记录限制在一定查找范围内的字段,主键便是一个很好的切入点。
3、索引的数据结构
生成索引:建立二叉查找树进行二分查找
生成索引:建立B-Tree结构进行查找
生成索引:建立B+ -Tree架构进行查找
生成索引:建立Hash结构进行查找
4、密集索引和稀疏索引的区别
区别:
- 密集索引文件中的每个搜索码值都对应一个索引值
- 稀疏索引码的某些值建立索引项
密集索引的定义:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只能有一个物理排列顺序,所以一个表只能创建一个密集索引。
稀疏索引:叶子节点仅仅是保存了键位信息以及该行数据的地址,有的稀疏索引只保存了键位信息机器主键。
mysam存储引擎:不管是主键索引,唯一索引还是普通索引都是稀疏索引
InnoDB存储引擎:有且只有一个密集索引,密集索引选取规则如下:
- 若四主键被定义,则主键作为密集索引
- 如果没有主键被定义,该表的第一个唯一非空索引则作为密集索引
- 若不满足以上条件,InnoDB内部会生成一个隐藏主键(密集索引)
- 非主键索引存储相关键位和其对应的主键值,包含两次查找