面试问题总结国庆假期已经结束了,没错我们只放了三天假!所以我们该收心还是要开始收心啦,毕竟现在不努力以后就要加倍努力了~所以我们还是接着之前的内容继续往后面学习,今天来看看关于数据库方面的面试题吧!
- MySQL索引的数据结构
- 由于MySQL数据库引擎在MySQL5.1版本之后默认为InnoDB,所以底层数据结构用到的是B+树实现的,且B+树的搜索效率可以达到二分法的性能
- 之所以用B+树而不用B树,是因为B+树不仅支持随机检索,还支持顺序检索,同时B+树的空间利用率更高,IO次数较少,磁盘的读写代价会更低;同时B+树的查询效率更加稳定!
- 如何去创建索引
- ALTER TABLE 表名 ADD 索引类型 [索引名](字段名)
- eg:ALTER TABLE student ADD unique(student_id)
- 常见索引的分类
- 非聚集索引
- 唯一索引(UNIQUE):不可以出现相同的值,可以用NULL
- 主键索引(PRIMARY KEY):不允许出现相同的值
- 普通索引(INDEX):允许出现相同的索引内容
- 全文索引(FULTEXT INDEX):可以针对值中的某个单词,但是效率确实不大行
- 聚集索引:数据行的物理顺序与列值逻辑顺序相同,而且一个表中只能拥有一个聚集索引
- 组合索引:将多个字段建到一个索引里,列值的组合必须唯一!
- 非聚集索引
- 聚簇索引和非聚簇索引的了解与区别
- 聚簇索引:把数据行按照一定顺序一个一个紧密排列在一起存储,是一种数据存储方式。使用场景:InnoDB
- 非聚簇索引:也叫二级索引,也就是需要两次B-Tree的查询。使用场景:MyISAM
- 区别:
- 两者的数据存储方式不同,非聚簇索引需要先查询一遍索引文件,得到索引,再根据索引去获取数据,聚簇索引直接就可以拿到数据
- 二级索引查询也不同,聚簇索引在二级索引进行查询时,需要先通过B+树得到数据的主键再去拿数据,所以会更加的消耗性能!
- 索引使用策略以及失效情况的说明
- 使用策略:
- 如果是多列符合索引,就需要遵循最佳左前缀法则,查询的时候要从索引的最左前列开始,而且不能跳查
- 遵循最好全值匹配,需要看索引的建立方式
- 失效情况:
- 对于索引的列没有进行操作时,就有可能导致索引失效
- 使用等于或者不等于的时候也有可能会导致索引失效
- 尽量减少使用select *操作,需要按需进行操作,不然也有可能会导致索引失效
- 模糊查询如果使用不当,也可能会导致全表查询,从而导致索引失效
- 使用策略:
- B树、B+树和二叉树的区别
- B树:一种多路搜索树(并不是二叉树)
- 特征:每一层的节点数目非常多,层数很少,目的就是为了减少磁盘的IO次数,从而提高查询性能。而它又是一种多路自平衡树,每个节点最多包含k个孩子,k为B树的阶!
- 特点:每个结点都会有Data域,只要找到匹配元素即可!无论匹配元素处于中间节点还是叶子节点,查询性能并不是很稳定!
- 应用场景:MongoDB
- B+树:
- 特征:B+树是基于B树的一种变体,有着更高的查询性能
- 特点:中间节点没有存储数据,只有叶子节点存放数据,其余节点用来存索引;相同数据量时此树更矮胖,查询必须查询到叶子节点,每次查找都是稳定的!
- 应用场景:大部分关系型数据库,如:MySQL
- 二叉树:
- 特征与特点:非叶子节点最多拥有两个子节点;而且非叶子节点的值要大于左边子节点,小于右边子节点;树左右两边的层级等级不会相差大于1;而且没有相同值的重复节点
- 应用场景:哈夫曼树(后面感兴趣的可以了解一下哈夫曼算法,也挺有意思的~)
- 平衡二叉树:数据库的索引是存储在磁盘上,磁盘IO操作比较耗时,为了提高查询效率就需要减少磁盘IO的次数,而磁盘IO次数和树的高度有关系,所以为了减少磁盘IO就需要降低树的高度,这时查找的机构就可以把二叉树变成B类的树!
- B树:一种多路搜索树(并不是二叉树)
- B+树和B树的优势
- 单一结点存储更多的元素,查询的IO次数更少
- 所有查询都要查询到子节点,查询性能更加稳定
- 所有的叶子节点形成有序链表,便于范围查询
- 红黑树和B树的区别
- 红黑树:多用于内部排序,也就是全部放在内存中
- B树:内存放不下,大部分数据是存储在外存上,IO读取磁盘数据较少,具有更快的速度
- SQL的执行顺序
- from>where>group by>having>select>order by>limit
- where后面不能接聚合函数,因为where在分组之前就执行了!
- 事务的四大特征
- A(Atomicity)原子性:不可分割,要么都执行,要么都失败。
- C(Consistency)一致性:事务完成时,数据必须一致。
- I(Isolation)隔离性:事务必须独立,不会相互依赖。
- D(Durability)持久性:事务完成后,数据库的数据修改会被永远保存,即使出现系统故障也不会丢失。
- MySQL是如何实现事务的
- 事务的四大特征:ACID
- 使用redolog来实现事务的一致性和持久性:其中有一个单点检查机制和双写机制(感兴趣的可以自行了解一下~)
- 隔离级别
- ISOLATION——DEFAULT:默认隔离界别
- ISOLATION_READ_UNCOMMITTED:读未提交,可出现脏读、不可重复读、幻读
- ISOLATION_READ_COMMITTED:读已提交,可能会出现不可重复读、幻读
- ISOLATION_REPEATABLE:可重复读,可能会出现幻读
- ISOLATION_SERIALIZABLE:序列化
- 脏读、不可重复读、幻读
- 脏读:一个事务能够读取到另外一个事务未提交的数据
- 不可重复读:一个事务内,多次读到的数据不一样
- 幻读:同一个事务内多次查询返回的数据集不一样
- MySQL数据库如何优化
- 优化查询:可以使用explain来查看Sql是如何执行查询语句的,从而分析你的索引是否满足需求!
- 优化子查询:使用连接查询去代替子查询可以提高查询效率
- 优化数据库表结构:添加中间表、把字段多的表进行分表等
其实今天在总结数据库方面面试题的时候,我发现数据库部分涉及到的理论知识确实挺多的,而且里面涉及了不少的数据结构,原本我是想着面试的时候让你写个sql不就挺好的嘛,看来是我草率了,,,不过总结后发现其实其中的事务这一块后面也会涉及到,而且很多内容都是一样的,所以感jio这总结的还是很可以的哈哈哈,再接再厉吧兄弟盟!



