关系型数据库主要考点
架构部分是考察你对数据库有没有整体的了解。索引部分和锁部分是最重点的考点实用的工作中用到的语法。数据库纯理论部分,如范式1的列不可再分,范式2的要有主键,范式3的去除传递依赖等等。
1、如何设计一个关系型数据库?
设计一个数据库,就跟设计一款软件差不多,也是将其分解成很多模块。此题主要考察面试者的模块划分能力以及对数据库的了解。
1.1【答案】:
要设计一个关系型数据库,我们首先要将其划分成两大部分。
一个是存储部分(类似一个文件系统),负责存储数据,用来将数据持久化到存储设备(磁盘)当中。
还需要有程序实例来对存储进行逻辑上的管理,程序实例分别又可以分为八个模块:
①
存储管理:将数据的逻辑关系转换为物理存储关系。【我们需要对数据的格式以及文件的分隔进行统一的管理,即把物理数据通过逻辑的形式给组织和表示出来。于是便涉及到了程序的存储管理模块。】
如何优化存储效能: 处理数据不可能在磁盘上做,而肯定是让程序加载到程序空间所在的内存里去做,而磁盘I/O速率往往是程序执行速度的主要瓶颈。因此为了执行效率,我们要尽可能的减少IO。就存储管理功能而言,如果按照逐行去查找并返回,那么这频繁的I/O会使数据库的执行效率极慢。因为一次I/O读取多条数据和单条数据花费的时间相差无几,所以我们可以一次性的去读取多行,以提升I/O效能,所以数据库是把逻辑存储单位用块或者页来表示,每个块或者页中会存放多行数据。这样读取的时候可以将多个块一起加载进内存当中。②
缓存机制:优化执行效率。
【把取出来的数据块存放在缓存里,下次需要时直接从内存返回而不用发生I/O。可以一次性加载多个页,这些块里包含的数据行有相当一部分并不是我们本次查询所需要的行,但是根据一旦某行数据被访问了,那么它周围的数据也极有可能被访问的经验,我们缓存的非本次数据也能起到优化访问效率的作用,可以用LRU等方法管理缓存】③
SQL解析:解析SQL语句。
【将SQL编译解析转换成机器可识别的指令,为了进一步提升SQL执行效率,可以将SQL缓存到缓存里,编译好的SQL方便下次来了能够直接进行解析】④
日志管理:记录操作。
方便我们做数据库的主从同步或者灾难恢复。比如binlog⑤
权限划分:进行多用户管理。
需要提供给用户管理数据的私密空间,即权限划分⑥
容灾机制:用于灾难恢复。
当数据库挂掉该如何恢复,恢复到什么程度,这些都需要设计。
⑦索引管理模块:优化数据查询效率。⑧锁管理模块:使得数据库支持并发操作。
二、索引模块
2、什么样的信息可以成为索引
主键,唯一键等那能让数据具有一定区分性的字段都可以作为索引能把该记录限定在一定查找范围内的字段,即我们刚刚所提到的关键信息,我们的主键便是一个很好的索引切入点。当然其他键位,包括唯一键以及普通键等也可以作为索引。
3、索引的数据结构
通常索引的结构是B+树,比较小众的也有Hash结构、BitMap等。【MySQL不支持BitMap】
b)BitMap(位图)索引
当表中的某个字段仅有固定几种值的时候,例如性别包括男和女。已知主流支持BitMap索引的数据库是Oracle数据库。位图索引结构类似于B+树,只需要存放是与否,因此只需要一个比特位来存放,因此一个叶子块可以存放很多的Bit位来表示不同的行,因此用来做统计时是很快的。位图索引的锁力度很大,对数据进行增删改查的时候,通常与之在同一个位图的数据都会被锁住(某行位置可能会发生改变)。所以它不适合高并发的联机事务处理系统(OLTP系统),适用于并发较少且统计运算较多的系统(OLAP系统)。