面试题答案
一键面试反范式设计适用场景
- 读多写少场景:
- 例如新闻网站,新闻一旦发布,后续主要是大量用户浏览。此时可在新闻表中冗余作者相关信息(如作者简介等),避免每次查询新闻都要关联作者表,减少连接操作。
- 实时性要求高场景:
- 以电商活动实时统计销量为例,为了快速展示实时销量数据,可在商品表中直接增加一个实时销量字段,每次有新订单时直接更新该字段,而无需通过复杂的订单表和商品表连接统计,从而快速响应前端请求。
- 跨表复杂查询频繁场景:
- 如社交平台的用户动态展示,可能涉及用户表、动态表、点赞表、评论表等多表连接查询。为了减少复杂连接,可在动态表中冗余部分用户信息(如用户名、头像等),简化查询逻辑,提高查询效率。
提升性能方式
- 减少连接操作:
- 范式设计通常会将数据拆分到多个表,查询时需要频繁进行表连接操作。反范式设计通过冗余数据,将原本需要连接的部分数据整合在一个表中,减少连接的表数量,从而降低查询的复杂度和开销。例如上述新闻网站场景,减少了新闻表与作者表的连接,查询速度大幅提升。
- 降低索引依赖:
- 范式设计下为了快速连接表,常依赖大量索引。反范式设计减少了连接,也就降低了对索引的依赖。例如实时统计销量场景,直接更新商品表中的销量字段,无需通过复杂索引来关联订单表进行统计,减少了索引维护开销和查询时索引查找开销。
- 缓存效率提升:
- 反范式设计下的数据更集中,在使用缓存(如 Redis)时,可将整个包含冗余数据的表或部分数据块缓存起来。这样在处理读请求时,从缓存获取数据的命中率更高,减少对数据库的直接访问,进一步提升性能。比如社交平台用户动态展示,缓存包含冗余用户信息的动态数据块,可快速响应前端展示需求。