面试数据库八股文十问十答第七期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)索引是越多越好吗?
不是的。虽然索引可以加快数据的检索速度,但是索引也会增加数据库的存储空间和维护成本。过多的索引会增加写操作的开销,因为每次对数据进行修改时都需要更新索引。此外,索引还会增加查询优化器的选择成本,并且在某些情况下,过多的索引可能会导致性能下降,因为查询优化器可能会选择错误的索引。因此,建立索引需要根据实际的查询需求和数据库的特点来进行权衡和选择。
2)你能说说在 B+ 树层面查询数据的全过程吗?越详细越好
B+ 树是一种常用于数据库索引结构的数据结构,其查询数据的全过程可以分为以下几个步骤:
- 根据查询条件在根节点进行查找:从根节点开始,根据查询条件找到对应的索引键或者索引范围。
- 根据索引键或者范围找到对应的叶子节点:在非叶子节点中,根据索引键的值找到对应的子节点,直到达到叶子节点。叶子节点保存了数据行的指针或者数据页的地址。
- 在叶子节点中进行查找:在叶子节点中根据索引键的值找到对应的数据行的指针或者数据页的地址。
- 如果需要,进行回表操作:如果查询的列不在索引中,需要根据数据行的指针或者数据页的地址到数据页中获取数据。
3)为什么要用 B+ 树?
B+ 树作为一种常用的索引结构,在数据库系统中有着广泛的应用,主要有以下几个原因:
- 平衡性:B+ 树是一种平衡树结构,保证了树的高度较低,从而保证了在最坏情况下的查询、插入和删除操作的时间复杂度为 O(logN)。
- 有序性:B+ 树的叶子节点构成了有序的链表,这样可以很方便地进行范围查询和范围扫描。
- 可扩展性:B+ 树支持动态的插入和删除操作,同时保持树的平衡性,使得数据库系统能够动态地适应数据的变化。
- 适应性:B+ 树适用于磁盘存储,可以很好地利用磁盘的预读特性,减少磁盘IO操作,提高查询性能。
- 支持多种操作:B+ 树不仅支持等值查询,还支持范围查询、范围扫描等多种操作,可以满足数据库系统中各种复杂的查询需求。
4)MySQL 是如何实现事务的
MySQL 使用了多种技术来实现事务的支持,其中最重要的是以下两种:
- 事务日志(Redo Log):MySQL 使用事务日志来保证事务的持久性。在事务提交之前,将事务的修改操作记录到事务日志中,然后再将这些修改写入到磁盘上的数据页中。在数据库发生崩溃或者重新启动时,MySQL 可以通过重放事务日志来恢复未完成的事务,保证事务的持久性。
- Undo Log:MySQL 使用 Undo Log 来支持事务的回滚和 MVCC。在事务执行过程中,将事务的修改操作记录到 Undo Log 中,然后再将这些修改写入到磁盘上的数据页中。如果事务需要回滚,可以通过 Undo Log 将数据恢复到事务开始之前的状态。
除了以上两种技术之外,MySQL 还使用了锁机制来保证事务的并发控制。通过对数据行、索引、表等级别的锁来控制并发事务的访问,保证事务的隔离性和一致性。
5)MySQL 长事务会造成什么问题?
长事务可能会导致以下几个问题:
- 锁资源占用:长事务持有的锁资源会长时间占用,导致其他事务无法访问或修改相关数据,从而降低数据库的并发性能。
- 内存占用增加:长事务中的未提交数据需要占用 Undo Log,长时间运行的事务会增加 Undo Log 的使用量,占用大量内存空间,导致内存压力增加。
- 版本链增长:长事务持续修改数据会生成大量的版本链,增加数据库的存储空间和维护成本。
- 数据一致性问题:长事务可能会导致数据库中出现脏数据或者不一致的数据,影响数据库的一致性和可靠性。
因此,为了避免以上问题,应尽量避免设计长时间运行的事务,或者将长事务拆分成多个短事务,减少事务持有锁资源和占用内存空间的时间。
6)什么是 MVCC?
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于实现数据库的并发控制的技术。在 MVCC 中,每个事务在读取数据时会看到一个固定版本的数据,并且事务之间的修改操作不会互相影响。
MVCC 的主要思想是为每个事务创建一个可见性视图,该视图定义了事务可以看到哪些数据版本。当事务开始时,MVCC 会为该事务创建一个时间戳,并在事务执行过程中使用该时间戳来确定事务可以看到的数据版本。当事务提交或者回滚时,MVCC 会更新事务的时间戳,并清理过期的数据版本。
MVCC 可以提高数据库的并发性能,减少事务之间的互相干扰,同时也能够提高数据库的可靠性和一致性。MySQL 中的 InnoDB 存储引擎就使用了 MVCC 技术来支持事务的并发控制。
7)如果没有 MVCC 怎么办?
如果没有 MVCC,数据库可以使用其他并发控制技术来确保事务的隔离性和一致性,例如使用锁来控制并发访问。在没有 MVCC 的情况下,数据库可能会采用更加保守的锁机制,例如在读取数据时对数据行进行加锁,以防止其他事务对数据进行修改。
8)MySQL 有几种事务隔离级别?
MySQL 支持以下四种事务隔离级别:
- 读未提交(Read Uncommitted):事务可以读取其他事务未提交的数据。这是最低级别的隔离级别,可能会导致脏读、不可重复读和幻读的问题。
- 读提交(Read Committed):事务只能读取其他事务已经提交的数据。这是 MySQL 的默认隔离级别。
- 可重复读(Repeatable Read):事务在整个事务期间可以多次读取相同的数据,并且保证这些数据不会发生变化。这可以防止不可重复读问题,但仍然可能发生幻读问题。
- 串行化(Serializable):最高级别的隔离级别,确保事务串行执行,以避免任何并发问题。虽然可以避免脏读、不可重复读和幻读问题,但会降低数据库的并发性能。
9)MySQL 的默认事务隔离级别是什么?为什么?
MySQL 的默认事务隔离级别是 读提交(Read Committed)。这个隔离级别提供了一种良好的平衡,既可以避免脏读问题,又能够在大多数情况下保证较好的并发性能。
10)脏读、不可重复读、幻读分别是什么?
- 脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。如果另一个事务回滚,那么读取的数据就是无效的。
- 不可重复读(Non-Repeatable Read):一个事务内多次读取同一数据,但是由于其他事务的修改,每次读取的数据可能都不一样。这种情况下,事务读取的数据是不一致的。
- 幻读(Phantom Read):一个事务在读取某个范围的数据时,另一个事务插入了新的数据行,导致第一个事务再次读取该范围时,发现数据行的数量或者内容发生了变化。这种情况下,事务读取的数据不符合预期,就像出现了幻觉一样。
这些问题在并发环境下可能会出现,而不同的事务隔离级别决定了数据库如何处理这些问题。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 1300+ Star,2W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐