2023最新Java面试题,大厂高频java面试真题
1. mysql 使用 innodb 引擎,请简述 mysql 索引的最左前缀,如何优化 order by 语句
最左前缀法则示例
假设index(a,b,c)
Where语句 | 索引是否被使用 |
---|---|
where a = 3 | Y,使用到a |
where a = 3 and b = 5 | Y,使用到a,b |
where a = 3 and b = 5 and c = 4 | Y,使用到a,b,c |
where b = 3 或者 where b = 3 and c = 4 或者 where c = 4 | N |
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 null | is null 支持索引 但是is not null 不支持,所以 a 可以使用索引,但是 b不一定能用上索引(8.0) |
where a <> 3 | 不能使用索引 |
where abs(a) =3 | 不能使用索引 |
where a = 3 and b like ‘kk%’ and c = 4 | Y,使用到a,b,c |
where a = 3 and b like ‘%kk’ and c = 4 | Y,只用到a |
where a = 3 and b like ‘%kk’ and c = 4 | Y,只用到a |
where a = 3 and b like ‘k%kk%’ and c = 4 | Y,使用到a,b,c |
关键点:
-
如果排序字段不在索引列上,产生 filesort. filesort(文件排序)有两种算法: mysql就要启动双路排序和单路排序
-
无过滤不索引(如果没有过滤条件,那么就用不到索引)
-
order by 没有遵循最左前缀法则,产生 filesort
-
顺序错, 产生 filesort
-
方向反, 产生 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;
-
记不住多动手做实验,熟练使用 explain,必要时使用 optimizer_trace
答案:
- 首先要对 sql 进行分析检查必要的查询字段(尽量不使用 select *),过滤字段,排序字段是否按顺序创建好了索引
- 如果查询字段不再索引中可能会产生回表操作会导致 filesort,降低性能
- 一定要有过滤字段不然不能使用索引
- 排序字段和索引顺序不一致会导致 filesort,降低性能
- 多个字段排序时如果方向不一致也会导致 filesort,降低性能
- 使用 explain 观察查询类型和索引利用情况
- 尽可能减少不必要的 filesort
2. JVM 内存模型中,为什么要区分新生代和年老代,对于新生代,为什么又要区分eden 区survial区?
关键点:
- 分清jvm标准与实现
- 分代收集算法在g1上是逻辑上的划分,之前的垃圾回收器可以理解是物理上的
- 标记算法
- 清除算法
- 内存连续空间
答案:
- 主流垃圾回收器 cms g1都使用了分代收集算法
- 正常系统运行时会有海量临时对象产生,这些对象短期内大部分就会失效,对于这些对象我们把他们临时放到新生代
- 新生代满了之后需要清理垃圾对象,我们会把有效对象复制到老年代,以便后续继续使用
- 为了更有效的区分哪些对象应该被复制到老年代,所以在新生代划分出了eden区和s0,s1区域
- 细化后的新生代内部被再次划分以便保证高速读写同时内存连续,
- 新对象会被保存到eden区(开始是空的所以内存连续),eden区满了会把有效对象复制到s0(s0也是空的所以也是连续空间)
- 清空eden区(再次写入时又是连续空间)
- s0 和 s1 在命名上互换,原来的s1等待写入(空的)
- eden区再次满了,重复上面步骤
- eden区通过复制/清除算法保证了读写连续性(因为新生代的对象产生和销毁非常频繁,所以才采用了清空的方式)
3. 典型的JDBC程序按()顺序编写( 排序)
以上内容均整理自尚硅谷2023最新Java面试题,大厂高频java面试真题