熙牛医疗Java开发工程师二面面经
《面试题目》
- 简单介绍自己。
- 实习经历拷打:追问业务全流程、解决思路及数据合理性验证。
- 介绍索引失效的常见场景。
- Redis缓存三件套(击穿、穿透、雪崩)及解决思路。
- 联合索引(a, b, c),执行
select * from table where a=? order by c是否走索引?说明索引定位流程。 - 执行
select * from table where a=? order by b DESC是否走索引? - 使用
in关键字时,是否一定不会导致索引失效? - 反问环节。
《参考解析》
-
联合索引问题 (5-6题):
- (a, b, c) 遵循最左前缀原则。
where a=? order by c无法利用 c 进行索引排序,因为中间缺少 b,会发生文件排序(filesort)。 where a=? order by b DESC可以走索引,因为满足了索引的最左匹配原则,且顺序一致。
- (a, b, c) 遵循最左前缀原则。
-
索引失效场景:
- 包括但不限于:使用
!=或<>、对列进行函数计算或类型隐式转换、like '%abc'以通配符开头、在联合索引中跨列查询等。
- 包括但不限于:使用
-
Redis缓存三件套:
- 穿透:布隆过滤器或缓存空对象;击穿:设置热点数据永不过期或加互斥锁;雪崩:过期时间加随机值、集群高可用、限流降级。
-
in 关键字索引:
in并不总是失效,但如果in的范围过大导致查询优化器认为全表扫描成本更低,则可能走全表扫描。需根据数据分布和索引选择性判断。