博客记录-day127-JVM,MySQL面试题

108 阅读6分钟

一、语雀-JVM面试题

1、什么是堆外内存?如何使用堆外内存?

✅什么是堆外内存?如何使用堆外内存?

image.png

1. NIO用堆外内存的原因

image.png

2、什么是跨代引用,有什么问题?

✅什么是跨代引用,有什么问题?

image.png

image.png

3、内存泄漏和内存溢出的区别是什么?

✅内存泄漏和内存溢出的区别是什么?

image.png

4、什么是Class常量池,和运行时常量池关系是什么?

✅什么是Class常量池,和运行时常量池关系是什么?

image.png

5、什么是safe point,有啥用?

✅什么是safe point,有啥用?

image.png

image.png

image.png

6、JDK1.8和1.9中类加载器有哪些不同

✅JDK1.8和1.9中类加载器有哪些不同

1. JDK 1.8及之前

image.png

7、JVM的并发回收和并行回收

✅说一说JVM的并发回收和并行回收

image.png

image.png

8、为什么初始标记和重新标记需要STW,而并发标记不需要?

✅为什么初始标记和重新标记需要STW,而并发标记不需要?

image.png

9、项目中如何选择垃圾回收器?为啥选择这个?

✅项目中如何选择垃圾回收器?为啥选择这个?

image.png

image.png

二、语雀-MySQL面试题

1、SQL执行计划分析的时候,要关注哪些信息?

✅SQL执行计划分析的时候,要关注哪些信息?

在分析SQL执行计划时,需重点关注以下信息:访问路径(如全表扫描、索引扫描)、连接类型(Nested Loop、Hash Join、Merge Join)、操作成本(CPU、I/O开销)、索引使用情况(是否命中、选择性是否合理)、数据分布统计(行数估算与实际差异)、潜在性能瓶颈(如大表扫描、排序操作、临时表使用),同时需对比执行计划中预估行数(Rows)与实际行数(Actual Rows)的偏差,以判断统计信息准确性或查询逻辑问题,并基于此优化索引设计、重写查询或调整数据库配置参数。

image.png

image.png

1. 如何判断一条SQL走没走索引

image.png

image.png

2、MySQL只操作同一条记录,也会发生死锁吗?

image.png

image.png

1. 锁冲突的根源

行级锁的粒度差异
InnoDB 的行锁(如 Next-Key Lock)不仅锁定记录本身,还可能锁定索引范围(间隙锁)。若两个事务以不同顺序访问同一记录的索引或间隙,可能引发锁竞争。

多索引影响
若同一记录有多个索引(如主键索引和二级索引),事务可能通过不同索引路径锁定同一数据,导致锁结构冲突。


2. 典型死锁场景

场景示例
  1. 事务 A
  • 更新记录 WHERE id = 1(通过主键索引),获取主键锁。
  • 尝试更新记录 WHERE name = 'A'(通过二级索引),此时需加锁二级索引及对应的主键范围。
  1. 事务 B
  • 更新记录 WHERE name = 'A'(通过二级索引),获取二级索引锁。
  • 尝试更新记录 WHERE id = 1(通过主键索引),发现主键已被事务 A 锁定。

此时,事务 A 和 B 互相持有对方需要的锁,形成循环等待,触发死锁。


3. 隔离级别的影响

可重复读(REPEATABLE READ)
默认隔离级别下,InnoDB 使用 Next-Key Lock(行锁 + 间隙锁),更容易因间隙范围锁定引发冲突。

读已提交(READ COMMITTED)
仅使用行锁,减少间隙锁范围,但仍可能因多索引或不同访问路径导致死锁。

3、数据库死锁如何解决?

✅数据库死锁如何解决?

image.png

image.png

4、索引失效的问题如何排查?

✅索引失效的问题如何排查?

image.png

5、如何进行SQL调优?

✅如何进行SQL调优?

image.png

以下是针对每个优化点的段落总结:


1. 分析执行计划(EXPLAIN)

通过EXPLAIN分析SQL执行计划是优化的首要步骤。需重点关注type字段,避免全表扫描(ALL),优先使用索引扫描(indexrangeref等);通过key字段确认实际使用的索引,若为NULL则可能未命中索引;结合rows字段与真实扫描行数(actual rows)差异,判断统计信息准确性;同时留意Extra列中的Using filesortUsing temporary等警告,这些操作会导致额外资源消耗。例如,若发现type=ALL,需检查是否缺少索引或索引选择性不足。


2. 索引优化

合理使用索引是提升查询性能的核心。应创建覆盖索引(包含查询所需全部字段)以避免回表,设计联合索引时需遵循最左前缀原则(如(user_id, order_date)匹配WHERE user_id=1 AND order_date>条件)。同时需避免冗余索引(如已有(a,b)时无需单独建(a))。索引失效的常见场景包括对索引列使用函数(如YEAR(create_time))、隐式类型转换(如字符串列用数字查询)及LIKE以通配符开头(如'%abc'),需针对性优化。


3. 查询语句重写

优化查询语句可直接降低资源消耗。通过精准WHERE过滤减少扫描数据量,分页场景应避免大偏移量(改用WHERE id > 值 LIMIT);简化复杂查询,拆分多表JOIN或改用临时表存储中间结果;优化JOIN逻辑时,将小表置于左侧并确保JOIN字段有索引;同时避免SELECT *,仅查询必要字段以减少网络和内存开销。


4. 数据库参数调优

合理配置数据库参数可显著提升性能。内存参数如innodb_buffer_pool_size建议设为物理内存的70%~80%以缓存数据;高读场景可启用query_cache,但高并发写入需谨慎;调整max_connections控制连接数,避免内存溢出;启用slow_query_log记录慢SQL定位瓶颈;磁盘层面采用SSD或RAID提升I/O效率。


5. 数据与表结构优化

表结构设计直接影响性能。按时间或范围分区可减少单次查询数据量(如按月分区订单表);垂直拆分将低频字段分离至其他表,水平分表(如按用户ID哈希)解决单表数据膨胀问题;选择紧凑数据类型(如INTBIGINTVARCHAR(20)TEXT)降低存储与计算成本。


8. 实际场景案例

案例1:某查询因缺失索引触发全表扫描,通过添加联合索引(user_id, order_date)将耗时从10秒降至200ms。
案例2:复杂JOIN生成临时表导致性能下降,通过拆分为两步查询(先索引过滤再JOIN)显著提升效率。

6、慢SQL的问题如何排查?

✅慢SQL的问题如何排查?

image.png image.png

7、MySQL主从复制的过程

✅MySQL主从复制的过程

image.png

image.png

1. 复制方式

image.png

image.png

8、介绍一下InnoDB的数据页,和B+树的关系是什么?

✅介绍一下InnoDB的数据页,和B+树的关系是什么?

image.png

9、MySQL的驱动表是什么?MySQL怎么选的?

✅MySQL的驱动表是什么?MySQL怎么选的?

image.png

10、MySQL执行大事务会存在什么问题?

✅MySQL执行大事务会存在什么问题?

image.png

11、MySQL怎么做热点数据高效更新?

✅MySQL怎么做热点数据高效更新?

image.png

image.png

12、什么是buffer pool?

✅什么是buffer pool?

image.png

image.png

image.png

1. buffer pool和query cache的区别

image.png

13、buffer pool的读写过程是怎么样的?

✅buffer pool的读写过程是怎么样的?

1. 读过程

image.png

2. 写过程

image.png

image.png