数据库面试考点归纳

2020年秋招期间自己归纳关于数据库的考点。通过秋招面试情况来看,大部分问题确实有被问到,对自己也有非常大的帮助。不建议直接看我写的回答,而是带着问题去总结自己的回答。相信坚持就会有好结果。

31个问题,共计九千多字。

1、 数据库的三大设计范式
数据库范式就是一张数据表的表结构所符合的某种设计标准的集合。
第一范式:列不可分,符合1NF的关系中的每个属性都不可再分。
第二范式:若某关系R属于第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则关系R属于第二范式。理解: 第二范式是指每个表必须有一个(有且仅有一个)数据项作为关键字或主键(primary key),其他数据项与关键字或者主键一一对应,即其他数据项完全依赖于关键字或主键。
第三范式:非主属性既不传递依赖于码,也不部分依赖于码。理解: 第三范式要求在满足第二范式的基础上,任何非主属性不依赖于其他非主属性,即在第二范式的基础上,消除了传递依赖。
https://4m.cn/9DgrX

2、 什么是数据库索引,有什么作用
是对表中一列或多列的值进行排序的一种数据结构,是为了加快查询速度而对表字段附加的一种标识。对表进行搜索默认的方式是全表扫描,如果为该字段添加索引,就可以直接定位到特定的行数,大大减少匹配行数,增加速度。

3、 数据库索引的底层数据结构实现是啥? B树和B+树的区别
Mysql数据库(InnoDB引擎)的索引是由B+树实现的
B树即N阶B树,指一个节点上最多有N个子树,它在平衡二叉树的基础上又极大的减小了树的深度,因此在进行搜索的时候会有更快的速度。缺点在于范围查询时,需要多次的回溯,当数据量较大时,极大的限制了查询速度。B+树将数据只存放在叶子节点上,非叶子节点用作索引。叶子节点用连续的双向链表连接,因此在不牺牲纵向查找速度的情况下,又能在横向叶子节点上快速确定查找范围。兼顾了查询的速度和范围查找的速度,所以许多数据库底层使用了B+树来实现。

4、 B+树相对于B树的优点
B+tree的磁盘读写代价更低:B+tree的内部结点并没有指向关键字具体信息的指针,因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;
B+tree的查询效率更加稳定:由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询路径长度相同,导致每一个数据的查询效率相当;
数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。

5、B树和B+树在节点存储结构上的差异
B树中每个节点存储的除了关键码的范围值,还包含了范围内多个关键码的有序表和指向含有这些关键码记录的指针(顺序表的大小一般为一个页面大小,方便从磁盘到内存的调页过程中只要一次I/O操作就可以完成)。当查找到该节点时,会先在顺序表中查找,若找到,则查找成功;否则,到按照对应的指针信息指向的子树中去查找,当到达叶子结点时,则说明树中没有对应的关键码。
B+树非叶节点只保存关键码的范围值,所有的关键码列表都存放在叶子节点中。因此,B+树中对数据的查找过程不管成果与否都会走完一条从根节点到叶子节点的完整路径。搜寻的效率是稳定的。

5、 数据库索引的优缺点
优点:通过创建唯一性索引可以保证数据库每一行数据的唯一性;可以大大加快数据查询分组和排序的时间;可以加快表之间的连接;
缺点:索引表的维护需要消耗时间和物理内存,且表越大,这种消耗越明显;此外对表进行增删改时,索引需要进行动态的维护,降低了数据的维护速度。

6、 什么样的表应该建立索引
数据量大,查询操作频繁。遵循的原则如下:
频繁作为查询条件的字段应该创建索引(where 后面的语句);
查询中与其它表关联的字段,外键关系建立索引;
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度;
查询中统计或者分组字段;

7、 哪些情况下不用建索引
加粗样式记录太少;
经常增删改的表;
Where条件里用不到的字段不创建索引;
数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引。
注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
特殊的格式例如文本或者图像不建立索引。

8、 创建索引时需要注意什么问题
非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;
取值离散大的字段:(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值