MySQL 面试题 真正的 offer 偏方 Java 基础 Java 高级
一、参考资料
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=93\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
二、笔记总结
01、InnoDB 如何解决幻读
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=93\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
02、B 数和 B+ 数的理解
- 为了理解树的概念,先看一下二叉树,二叉树每个节点最多支持两个分叉。
- 二叉查找树,是指在二叉树的基础上增加了一个规则,左边下于根节点,右边大于根节点,可能出现斜数问题,所有子节点都在一边。
- 平衡二叉树,具有二叉查找树的所有特点,同时增加了一个规则,左右两个子树的高度差的绝对值不能超过 1。
- B 树是一种多路平衡查找树,满足平衡二叉树的规则同时可以有更多子树,子树的数量等于关键字数量加一。
- B+ 树是在 B 树的基础上做了增强
- B 树的数据存储在每个节点上,B+ 树的数据存储在叶子节点上。
- B+ 树的子路数量等于关键字的数量。



03、为什么一线互联网公司严禁使用存储过程
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=94\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
04、MySQL 中的 RR 隔离级别,到底有没有解决幻读问题
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=97\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
05、MySQL 是如何解决幻读问题的
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=98\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
06、无
07、什么是聚集索引和非聚集索引
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=99\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
08、MySQL 的事务隔离级别是什么
- 事务隔离级别是为了解决多个并行事务竞争导致的数据安全性问题的一种规范
- 假设两个事务 T1 和 T2 同时执行,T1 事务可能读取到 T2 事务未提交的数据,T2 事务可能回滚导致 T1 事务读取到不存在的数据,脏读。
- 假设两个事务 T1 和 T2 同时执行,事务 T1 在不同的时刻读取同一行数据结果可能不一样,不可重复读。
- 假设两个事务 T1 和 T2 同时执行,事务 T1 执行范围查询,事务 T2 插入一条属于事务 T1 查询范围的数据并提交,幻读。
- SQL 标准中定义了四种隔离级别
- 读未提交,可能产生脏读、不可重复读、幻读问题。
- 读已提交,可能产生不可重复度、幻读问题。
- 可重复读,可能产生幻读问题。
- 串行化,多个并行事务串行化执行,不会产生安全性问题。
- InnoDB 引擎默认的隔离级别是 RR 可重复读。
09、binlog 和 redolog 有什么区别
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=101\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
10、日常工作中怎么优化 SQL
- 加索引
- 增加索引是一种简单高效的手段,但是需要选择合适的列,同时避免导致索引失效的操作,比如 like 函数等。
- 避免返回不必要的数据列
- 减少返回的数据列可以增加查询效率
- 根据查询分析器适当优化 SQL 结构
- 比如是否走全表扫描,避免子查询等。
- 分库分表
- 在单表数据量过大的情况下,可以通过这种方式有序提高查询效率。
- 读写分离
- 针对读多写少的场景,这样可以保证写操作的数据库承受更小的压力,也可以缓解锁的竞争。
11、MySQL 主从集群同步延迟问题怎么解决
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=103\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
12、MySQL 数据库 CPU 飙升的话,要怎么处理呢
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=104\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
13、MySQL 为什么使用 B+树 作为索引结构
- 常规的数据库存储引擎一般都是采用 B 树或 B+ 树实现索引的存储
- B 树是一种多路平衡树,用这种存储结构存储大量数据的情况下,整体高度相比于二叉树会矮很多,数据库的数据存储在磁盘上,磁盘 IO 的效率很低,树的高度决定了磁盘 IO 的次数,磁盘 IO 次数越少对性能提升就会越大。
- MySQL InnoDB 存储引擎采用的是 B+ 树来作为索引和数据的存储结构。
- 相比于 B 树,B+ 树的所有数据存储在叶子节点上,非叶子节点只会存储索引。
- 叶子节点的数据采用双向链表进行关联
- 使用 B+ 树作为索引存储结构的原因
- B+ 树的非叶子节点不存储数据,所以每一层能够存储的索引数量会增加,意味着相同高度的情况下,B+ 树存储的数据更多,这样的话磁盘的 IO 次数会更少。
- B+ 树所有存储在叶子节点的数据使用双向链表进行了关联,范围查询时效率更高。
- 由于所有的数据存储在叶子节点,所以 B+ 树的 IO 次数更加稳定。
- 由于所有的数据存储在叶子节点,所以 B+ 树的全局扫描能力更强,因为它只需要扫描叶子节点,但是 B 树需要遍历整个树。
14、数据库连接池有什么用
- 数据库的连接池是一种池化技术,池化技术的核心思想是实现资源的复用,避免资源的重复创建和消耗带来的开销。
- 应用程序每一次对数据库发起 CRUD 操作时都需要创建连接,在数据库访问量比较大的情况下,频繁的创建连接会带来比较大的性能开销。
- 连接池的核心思想就是应用程序在启动的时候提前初始化一部分连接保存在连接池里面,当应用程序需要操作数据库时直接从连接池中取出已经建立好的连接。
- 所有连接池的设计避免了每一次连接的建立和释放带来的一个开销。
- 创建连接池的参数有很多,关键参数有
- 初始化连接数,表示启动的时候,需要初始化多少连接保存到连接池里面。
- 最大连接数,表示同时支持多少个连接,如果连接满了,后续获取连接的线程会阻塞。
- 最大空闲连接数,表示没有请求的时候,连接池内保持的最大空闲连接。
- 最小空闲连接数,当连接池内的连接数小于这个数时,补充创建新的连接。
- 使用连接池的参数有很多,关键参数有
- 最大等待时间,连接池连接用完以后,新的请求等待的时间。
- 无限连接清除,清除无效连接,避免出现错误。
15、请说一下 MySQL 索引的优点和缺点
- 索引是一种可以帮助 MySQL 高效从磁盘检索数据的数据结构
- 在 MySQL 的 InnoDB 引擎中采用 B+ 树实现索引和数据的存储
- 索引的优点
- 使用 B+ 树的结构存储数据可以减少数据检索时磁盘 IO 次数,从而提升数据查询性能。
- B+ 树进行范围查询基于叶子节点链表结构,查询效率高。
- 通过唯一索引保证数据表里每一行数据的唯一性
- 索引的缺点
- 数据增删改时,涉及到索引的维护,数据量大时,索引的维护会带来较大的性能开销。
- 一个表允许存在一个聚集索引和多个非聚集索引,但是索引的数量不能太多,否则维护索引的成本过高。
- 创建索引时,需要考虑字段值的分散性,如果字段的重复数据多,创建索引返回导致性能降低。
- 任何技术方案都有两面性,大部分情况下,技术方案的选择更多的是看中它的优势和当前问题的匹配度。
16、MySQL 事务的实现原理
- MySQL 中的事务满足 ACID 的特性,MySQL 事务的原理就是 InnoDB 如何保证 ACID 特性。
- A 表示原子性,多个 DML 操作要么全部成功要么全部失败。
- 如果失败就意味着要对原本执行成功的数据进行回滚,所以 InnoDB 设计了一个 UNDO_LOG 表,把修改前的数据保存进去,一旦出现错误就直接从表中读取数据进行还原。
- C 表示一致性,数据的完整性依赖没有被破坏。
- 数据库本身提供了主键的唯一约束,字段长度和类型的一些保障等等。
- I 表示隔离性,也就是说多个并行事务对同一个数据进行操作的时候,如何避免多个事务的干扰导致数据混乱的一个问题。
- InnoDB 实现了 SQL 92 的标准,提供了四种隔离级别的实现,分别是读未提交、读已提交、可重复读、串行化。
- InnoDB 默认采用的隔离级别是可重复读,解决了脏读、不可重复读的问题。
- InnoDB 实现了 SQL 92 的标准,提供了四种隔离级别的实现,分别是读未提交、读已提交、可重复读、串行化。
- D 表示持久性,子要事务提交成功,对数据的影响一定是永久的,不能因为数据库宕机或其它原因导致数据库变更失效。
- InnoDB 设计了缓冲区进行优化,也就是说数据变更时先更新内存缓冲区然后再持久化到磁盘里面。
- InnoDB 引入了 REDO_LOG 文件,存储数据库变更后的数据,一旦数据库宕机重启后,可以读取 REDO_LOG 文件的记录,把数据持久化到硬盘。
17、说一下你对行锁、临键锁、间隙锁的理解
- 行锁、临键锁、间隙锁都是 MySQL InnoDB 引擎去解决事务隔离性的一系列排它锁。
- 行锁
- 当我们针对主键或唯一索引加锁的时候,MySQL 默认会为这一行数据加行锁,避免其它事务修改这一行数据。
- 间隙锁
- 顾名思义就是锁定一个索引区间,在普通索引或者唯一索引的列上,由于索引是基于 B+ 树的一个结构存储,所以会存在一个索引的区间,间隙锁会锁定左右开区间的一个范围,在基于索引列的范围查询中无论是否是唯一索引都会触发间隙锁。
- 临键锁
- 相当于行锁加间隙锁的组合,锁定范围即包含索引记录也包含索引区间,会锁定一个左开右闭的范围,使用非唯一索引进行查询时,默认会加一个临键锁,索引一个左开右闭的范围。
- 行锁、临键锁、间隙锁表示锁定数据的范围,最终是为了解决幻读的问题。
18、索引什么时候失效
- InnoDB 引擎有两种索引类型,主键索引和普通索引,InnoDB 使用 B+ 树存储索引数据。
- 不规范的使用索引列进行查询会导致索引失效
- 在索引列上做运算,比如加函数
- 多列构成的组合索引需要遵守最左匹配法则,在组合索引中,索引的存储机构是按照列的顺序存储的,因此在 SQL 中也要按这个顺序,列才能逐一匹配。
- 索引列存在隐式转换的时候,比如索引列是字符串类型,但是在 SQL 中没有加引号,那么 MySQL 会进行自动类型的转换,从而导致索引失效。
- 索引列使用不等于号或 not 查询时候,索引会失效。
- 使用 like 通配符匹配后缀的时候,不符合索引的最左匹配原则,索引失效。
- 使用 or 连接查询的时候,or 前后没有同时使用索引时,索引失效。
- 最终是否走索引可以使用 explain 命令查看 SQL 的执行计划,然后可以针对性的进行调优,从而提升 SQL 的执行效率。
19、MySQL 如何解决幻读问题
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=111\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
20、MySQL 中 MyISAM 和 InnoDB 引擎的区别
- 数据存储方式不同
- MyISAM 数据和索引是分开存储的,InnoDB 是把索引和数据存储在同一个文件中。
- 对于事务的支持不同
- MyISAM 不支持事务,InnoDB 支持 ACID 特性的事务处理。
- 对于锁的支持不同
- MyISAM 只支持表锁,InnoDB 支持行锁、表锁、间隙锁、临键锁。
- 外键
- MyISAM 不支持外键,InnoDB 支持外键。
- 在实际应用中可以根据不同的场景选择合适的存储引擎,比如如果需要事务,必须选择 InnoDB,如果都是查询操作,可以选择 MyISAM。
21、存储 MD5 的值应该用 VARCHAR 还是 CHAR
- 应该使用 CHAR 类型,CHAR 类型是一种固定长度的字符串,VARCHAR 是一种可变长度的字符串。
- MD5 算法生成的数字是固定长度的,这点符合 CHAR 类型的特征,CHAR 类型是固定长度,数据变更时不需要调整存储空间的大小,在效率上比 VARCHAR 更高。
22、MySQL 索引在什么情况下会失效
- 同 18
23、MVCC 过程中会加锁吗
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=115\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
24、MySQL update 是行锁还是表锁
- MySQL 的 update 操作既可以是行锁也可以是表锁,具体使用哪种类型的锁,取决于 update 的条件,事务隔离级别等因素。
- 如果 where 条件包含索引列并且只更新一条数据,那会加行锁。
- 如果 where 条件不包含索引列会加表锁
25、为什么 SQL 语句不要过多的 join
- 性能问题
- 每个 join 操作都需要对多个表进行连接操作,这个操作需要消耗资源和时间,如果 join 操作过多会导致 SQL 的执行效率下降,影响系统性能。
- 可读性和维护性问题
- join 操作会使得 SQL 语句变复杂,难以理解和维护。
26、什么情况下不建索引
- 数据量太小的情况,即使没有索引,查询也比较快。
- 数据离散度不高的列,比如性别年龄这种,创建索引反而降低检索效率。
- 存在函数操作的情况下,不会走索引。
- 频繁变更的表,经常进行增删改操作,这种情况建立索引开销很大。
27、MySQL 的性能调优方法
- 表结构和索引优化
- 比如分库分表、读写分离、为字段选择合适的数据类型、为查询操作创建必要的索引等等
- SQL 语句优化
- 使用慢查询分析需要优化的 SQL,利用 explain 工具去分析 SQL 的执行计划。
- 避免使用 select * 查询
- MySQL 参数优化
- 设置缓存 Buffer_pool 的大小,官方建议占总内存的 50-70%。
- 设置刷盘策略,平衡好数据安全性和性能的关系。
- 硬件及系统配置优化
- CPU 核心数,磁盘读写性能,网卡,内存的大小等等。