前言
作者:小蜗牛向前冲
名言:我可以接受失败,但我不能接受放弃
如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正
总结一下mysql中常见的面试题
1、MySQL中的索引知道吗?能讲讲索引有哪些种类吗?都有什么用
答:
mysql中的索引他能提高数据库的查询速度,我们为数据表中的特点列创建数据结构(这InnoDB存储引擎,底层原理是b+树)通过这个数据结构快速查找到结果,我们可以把索引理解为一个本书的目录,通过空间来换取时间。
mysql按照不同的分类可以分为不同的索引类型:
- 按照物理存储分类:聚族索引(主键索引),二级索引(辅助索引)
- 按照字段特效分类:主键索引,唯一索引,普通索引,前缀索引。
对于聚族索引B++树的叶子节点存放的是数据,而非叶子节点存放的是索引。
二级索引B++树的叶子节点存放的是主键,而不是数据。
当我们通过主键索引查找数据的时候,会直接通过B++树的数据结构在叶子节点查找到数据,而二级索引,他的B++树由于叶子存放的是主键 ,他会找到对应的主键,在另外一颗存放主键的B++树中查找数据,这个过程我们称为回表。当我们查找的数据可以在二级索引中找到我们就称为覆盖。
2、为什么在InnoDB存储引擎选择B++树做为索引的底层结构,其他的数据结构可以不可以?
答:
数据库他的工作就是于磁盘打交道,无论他是存储还是查找数据,都是要进行I/O的。所以我们选择的数据结构应该满足:
- 能在尽可能少的磁盘的 //0 操作中完成查询工作,
- 要能高效地查询某一个记录,也要能高效地执行范围查找
二分查找树,虽然他的查找的时间复杂度O(logn),但是他在特殊情况下会退化为链表,那时间复杂度就变为了O(n)。
平衡二叉查找树(AVL 树),虽然他解决了这特殊情况下不会退化为链表的情况下,但是如果随着节点的增多,树的高度也会变高,树的高度变高也就意味着I/O的次树会增加。
B树,B树是一种多叉树,他的每个节点都存放着索引+记录。
B+树,B+树也是一种多叉树,他只有叶子节点才会存放记录,并且这些记录是通过双向链表连接起来的。
但是我们这里仍会选择b+树做为mysql索引的底层结构,原因如下:
对于单点查询:由于B++树只有叶子节点才会存放数据,而非叶子结构只会存放索引,但是B树的节点既存放数据+索引,这就导致在有相同的数据情况下B++树会比B树更加矮胖,这也意味着I/O的次数会更少。
插入和删除效率:B++树在删除数据是非常快的,因为数据都在最底层的叶子节点,基本上删除一个节点就可以了。但是B树在删除节点的过程由于没有冗余节点,这就要导致在删除节点后要进行复杂的树形变形来维持树的结构。插入和删除也是一样的。
范围查询:B+树和B树的查找都是从根节点开始,递归向子节点查找,但是B+ 树所有叶子节点间还有一个链表进行连接,这种设计对范围查找非常有帮助,而B树没有这样的结构,比如当我们都查找底层某个叶子节点的时候,B++树可以通过链表进行查找,而不需要在递归返回到上层节点,这样就减少了不必要的I/O,B树就只能返回查找。
3、事务了解吗?他的特性有哪些?能讲一讲你对隔离级别的理解吗?
答:事务是用来 管理数据库中一组逻辑操作的单元,他要么不执行,要么完全执行以保证数据库的一致性
事务有四大特性ACID:
- 原子性(Atomicity):指的事务的操作要么全部成功,要么全部失败回滚。
- 一致性(Consistency):在事务的执行前后,数据库都是一致的,也可以认为是符合预期的,比如当我向张三转账300,张三的银行账号应该增加300,也我的账户应该减少300。如果都发生了就是符合预期,这也就是一致性。
- 隔离性(Isolation):多个并发事务之间相互隔离,一个事务的执行不能被其他事务干扰,这个由事务的隔离级别决定。
- 持久性(Durability):一旦事务提交,对其数据库的影响是永久的,即使发生了故障也不会影响结果。
事务的隔离性是由隔离级别决定的,有四种隔离级别,从低到高:
读未提交:指一个事务可以读取到其他未递交的事务,但是会导致脏读,幻读,不可以重复读。
读以提交:一个事务只能读取已经提交的数据,但是仍会导致不可重复读,幻读。
可重复读:在同一事务中读取同一数据上一致的,不会受到其他事务的影响,防止其实事务的干扰,但可能会出现幻读。
可序列化:最高的隔离级别,事务完全串行化执行,事务之间完全隔离,并发性能最差,因为事务完全串行化执行。
- 脏读指:在事务中读到了未提交的数据。
- 不可重复读指:在同一事务中,二次读取结果不同
- 幻读:在同一事务中,二次查询的结果不一致,比如:新增或者删除的行在第二次查询中会消失。