熙牛医疗Java开发工程师二面面经

熙牛医疗 · Java开发 · 二面 · 2026-03

《面试题目》

  1. 简单介绍自己。
  2. 实习经历拷打:追问业务全流程、解决思路及数据合理性验证。
  3. 介绍索引失效的常见场景。
  4. Redis缓存三件套(击穿、穿透、雪崩)及解决思路。
  5. 联合索引(a, b, c),执行 select * from table where a=? order by c 是否走索引?说明索引定位流程。
  6. 执行 select * from table where a=? order by b DESC 是否走索引?
  7. 使用 in 关键字时,是否一定不会导致索引失效?
  8. 反问环节。

《参考解析》

  1. 联合索引问题 (5-6题)

    • (a, b, c) 遵循最左前缀原则。where a=? order by c 无法利用 c 进行索引排序,因为中间缺少 b,会发生文件排序(filesort)。
    • where a=? order by b DESC 可以走索引,因为满足了索引的最左匹配原则,且顺序一致。
  2. 索引失效场景

    • 包括但不限于:使用 !=<>、对列进行函数计算或类型隐式转换、like '%abc' 以通配符开头、在联合索引中跨列查询等。
  3. Redis缓存三件套

    • 穿透:布隆过滤器或缓存空对象;击穿:设置热点数据永不过期或加互斥锁;雪崩:过期时间加随机值、集群高可用、限流降级。
  4. in 关键字索引

    • in 并不总是失效,但如果 in 的范围过大导致查询优化器认为全表扫描成本更低,则可能走全表扫描。需根据数据分布和索引选择性判断。