mysql 面经
说一说索引失效
- 查询条件包含or,可能导致索引失效
- 如果字段类型是字符串,where时一定用引号括起来,否则索引失效
- like通配符可能导致索引失效。
- 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
- 在索引列上使用mysql的内置函数,索引失效。
- 对索引列运算(如,+、-、*、/),索引失效。
- 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
- 索引字段上使用is null, is not null,可能导致索引失效。
- 左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
- mysql估计使用全表扫描要比使用索引快,则不使用索引。
redis面经
简单聊聊缓存雪崩、穿透、击穿
- 缓存雪崩:核心缓存在同一时间点,大量过期失效,导致请求直接到数据库,导致数据库崩溃
- 解决方法:
- 过期时间随机:结合业务情况,随机设置过期时间,避免大量数据同一时间过期
- 互斥加锁(限流):使用锁机制避免并发请求,会导致吞吐量明显下降
- 不设置过期:热点数据不设置过期,存在数据更新先删除再加载
- 解决方法:
- 缓存击穿:缓存击穿是指一个热点 key 过期或被删除后,导致线上原本能命中该热点 key 的请求,瞬间大量地打到数据库上,最终导致数据库被击垮。
- 解决方法:
- 梳理逻辑:找到热点数据击穿业务原因,重新明确流程,保证核心功能与流程
- 加强管理:避免热点数据被删除
- 解决方法:
- 缓存穿透:客户端请求缓存和数据库中不存在的数据,导致所有的请求都打到数据库上。如果请求很多,数据库依旧会挂得明明白白。
- 解决方法:
- 参数校验:做好业务参数校验,避免直接访问数据库
- 数据缓存:对访问的数据,及时放入缓存中。减轻数据库压力
- 拦截限流:判断请求是否有效,降低访问缓存和数据的频率
- 解决方法:
- 业务可靠性处理:redis 缓存可用性
- 解决方法:
- 主从结构:使用redis主从+ 哨兵 或者redis集群架构。保证redis的可用性
- 降低缓存依赖:结合业务场景,考虑本地缓存,降低redis压力
- 业务降级:从保护下游的角度考虑,大流量下进行限流与服务降级,避免拖垮下游服务。
- 解决方法: