一、语雀-JVM面试题
1、什么是堆外内存?如何使用堆外内存?
1. NIO用堆外内存的原因
2、什么是跨代引用,有什么问题?
3、内存泄漏和内存溢出的区别是什么?
4、什么是Class常量池,和运行时常量池关系是什么?
5、什么是safe point,有啥用?
6、JDK1.8和1.9中类加载器有哪些不同
1. JDK 1.8及之前
7、JVM的并发回收和并行回收
8、为什么初始标记和重新标记需要STW,而并发标记不需要?
9、项目中如何选择垃圾回收器?为啥选择这个?
二、语雀-MySQL面试题
1、SQL执行计划分析的时候,要关注哪些信息?
在分析SQL执行计划时,需重点关注以下信息:访问路径(如全表扫描、索引扫描)、连接类型(Nested Loop、Hash Join、Merge Join)、操作成本(CPU、I/O开销)、索引使用情况(是否命中、选择性是否合理)、数据分布统计(行数估算与实际差异)、潜在性能瓶颈(如大表扫描、排序操作、临时表使用),同时需对比执行计划中预估行数(Rows)与实际行数(Actual Rows)的偏差,以判断统计信息准确性或查询逻辑问题,并基于此优化索引设计、重写查询或调整数据库配置参数。
1. 如何判断一条SQL走没走索引
2、MySQL只操作同一条记录,也会发生死锁吗?
1. 锁冲突的根源
• 行级锁的粒度差异:
InnoDB 的行锁(如 Next-Key Lock)不仅锁定记录本身,还可能锁定索引范围(间隙锁)。若两个事务以不同顺序访问同一记录的索引或间隙,可能引发锁竞争。
• 多索引影响:
若同一记录有多个索引(如主键索引和二级索引),事务可能通过不同索引路径锁定同一数据,导致锁结构冲突。
2. 典型死锁场景
场景示例:
- 事务 A:
- 更新记录
WHERE id = 1(通过主键索引),获取主键锁。 - 尝试更新记录
WHERE name = 'A'(通过二级索引),此时需加锁二级索引及对应的主键范围。
- 事务 B:
- 更新记录
WHERE name = 'A'(通过二级索引),获取二级索引锁。 - 尝试更新记录
WHERE id = 1(通过主键索引),发现主键已被事务 A 锁定。
此时,事务 A 和 B 互相持有对方需要的锁,形成循环等待,触发死锁。
3. 隔离级别的影响
• 可重复读(REPEATABLE READ):
默认隔离级别下,InnoDB 使用 Next-Key Lock(行锁 + 间隙锁),更容易因间隙范围锁定引发冲突。
• 读已提交(READ COMMITTED):
仅使用行锁,减少间隙锁范围,但仍可能因多索引或不同访问路径导致死锁。
3、数据库死锁如何解决?
4、索引失效的问题如何排查?
5、如何进行SQL调优?
以下是针对每个优化点的段落总结:
1. 分析执行计划(EXPLAIN)
通过EXPLAIN分析SQL执行计划是优化的首要步骤。需重点关注type字段,避免全表扫描(ALL),优先使用索引扫描(index、range、ref等);通过key字段确认实际使用的索引,若为NULL则可能未命中索引;结合rows字段与真实扫描行数(actual rows)差异,判断统计信息准确性;同时留意Extra列中的Using filesort或Using 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哈希)解决单表数据膨胀问题;选择紧凑数据类型(如INT替BIGINT、VARCHAR(20)替TEXT)降低存储与计算成本。
8. 实际场景案例
• 案例1:某查询因缺失索引触发全表扫描,通过添加联合索引(user_id, order_date)将耗时从10秒降至200ms。
• 案例2:复杂JOIN生成临时表导致性能下降,通过拆分为两步查询(先索引过滤再JOIN)显著提升效率。
6、慢SQL的问题如何排查?