2023最新Java面试题,大厂高频java面试真题(持续更新中)

1. mysql 使用 innodb 引擎,请简述 mysql 索引的最左前缀,如何优化 order by 语句

 
最左前缀法则示例
假设index(a,b,c)

Where语句索引是否被使用
where a = 3Y,使用到a
where a = 3 and b = 5Y,使用到a,b
where a = 3 and b = 5 and c = 4Y,使用到a,b,c
where b = 3 或者 where b = 3 and c = 4 或者 where c = 4N
where a = 3 and c = 5使用到a, 但是c不可以,b中间断了
where a = 3 and b > 4 and c = 5使用到a和b, c不能用在范围之后,b断了
where a is null and b is not nullis null 支持索引 但是is not null 不支持,所以 a 可以使用索引,但是 b不一定能用上索引(8.0)
where a <> 3不能使用索引
where abs(a) =3不能使用索引
where a = 3 and b like ‘kk%’ and c = 4Y,使用到a,b,c
where a = 3 and b like ‘%kk’ and c = 4Y,只用到a
where a = 3 and b like ‘%kk’ and c = 4Y,只用到a
where a = 3 and b like ‘k%kk%’ and c = 4Y,使用到a,b,c

关键点:

  1. 如果排序字段不在索引列上,产生 filesort. filesort(文件排序)有两种算法: mysql就要启动双路排序和单路排序

  2. 无过滤不索引(如果没有过滤条件,那么就用不到索引)

  3. order by 没有遵循最左前缀法则,产生 filesort

  4. 顺序错, 产生 filesort

  5. 方向反, 产生 filesort

    8.0 为 Backward index scan 倒序索引
    EXPLAIN SELECT age FROM emp WHERE age>45 ORDER BY age desc,deptid desc,NAME desc
    
    方向反 产生filesort
    EXPLAIN SELECT age FROM emp WHERE age>45 ORDER BY age desc,deptid desc,NAME asc;
    
  6. 记不住多动手做实验,熟练使用 explain,必要时使用 optimizer_trace

答案:

  1. 首先要对 sql 进行分析检查必要的查询字段(尽量不使用 select *),过滤字段,排序字段是否按顺序创建好了索引
  2. 如果查询字段不再索引中可能会产生回表操作会导致 filesort,降低性能
  3. 一定要有过滤字段不然不能使用索引
  4. 排序字段和索引顺序不一致会导致 filesort,降低性能
  5. 多个字段排序时如果方向不一致也会导致 filesort,降低性能
  6. 使用 explain 观察查询类型和索引利用情况
  7. 尽可能减少不必要的 filesort

2. JVM 内存模型中,为什么要区分新生代和年老代,对于新生代,为什么又要区分eden 区survial区?

 
在这里插入图片描述

关键点:

  1. 分清jvm标准与实现
  2. 分代收集算法在g1上是逻辑上的划分,之前的垃圾回收器可以理解是物理上的
  3. 标记算法
  4. 清除算法
  5. 内存连续空间

答案:

  1. 主流垃圾回收器 cms g1都使用了分代收集算法
  2. 正常系统运行时会有海量临时对象产生,这些对象短期内大部分就会失效,对于这些对象我们把他们临时放到新生代
  3. 新生代满了之后需要清理垃圾对象,我们会把有效对象复制到老年代,以便后续继续使用
  4. 为了更有效的区分哪些对象应该被复制到老年代,所以在新生代划分出了eden区和s0,s1区域
  5. 细化后的新生代内部被再次划分以便保证高速读写同时内存连续,
  • 新对象会被保存到eden区(开始是空的所以内存连续),eden区满了会把有效对象复制到s0(s0也是空的所以也是连续空间)
  • 清空eden区(再次写入时又是连续空间)
  • s0 和 s1 在命名上互换,原来的s1等待写入(空的)
  • eden区再次满了,重复上面步骤
  1. eden区通过复制/清除算法保证了读写连续性(因为新生代的对象产生和销毁非常频繁,所以才采用了清空的方式)

3. 典型的JDBC程序按()顺序编写( 排序)

 

以上内容均整理自尚硅谷2023最新Java面试题,大厂高频java面试真题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值