MST

星途 面试题库

面试题:MySQL反范式设计的常见应用场景

请阐述在MySQL数据库中,反范式设计通常会应用在哪些场景下,并且说明这样做如何提升性能。
14.7万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

反范式设计适用场景

  1. 读多写少场景
    • 例如新闻网站,新闻一旦发布,后续主要是大量用户浏览。此时可在新闻表中冗余作者相关信息(如作者简介等),避免每次查询新闻都要关联作者表,减少连接操作。
  2. 实时性要求高场景
    • 以电商活动实时统计销量为例,为了快速展示实时销量数据,可在商品表中直接增加一个实时销量字段,每次有新订单时直接更新该字段,而无需通过复杂的订单表和商品表连接统计,从而快速响应前端请求。
  3. 跨表复杂查询频繁场景
    • 如社交平台的用户动态展示,可能涉及用户表、动态表、点赞表、评论表等多表连接查询。为了减少复杂连接,可在动态表中冗余部分用户信息(如用户名、头像等),简化查询逻辑,提高查询效率。

提升性能方式

  1. 减少连接操作
    • 范式设计通常会将数据拆分到多个表,查询时需要频繁进行表连接操作。反范式设计通过冗余数据,将原本需要连接的部分数据整合在一个表中,减少连接的表数量,从而降低查询的复杂度和开销。例如上述新闻网站场景,减少了新闻表与作者表的连接,查询速度大幅提升。
  2. 降低索引依赖
    • 范式设计下为了快速连接表,常依赖大量索引。反范式设计减少了连接,也就降低了对索引的依赖。例如实时统计销量场景,直接更新商品表中的销量字段,无需通过复杂索引来关联订单表进行统计,减少了索引维护开销和查询时索引查找开销。
  3. 缓存效率提升
    • 反范式设计下的数据更集中,在使用缓存(如 Redis)时,可将整个包含冗余数据的表或部分数据块缓存起来。这样在处理读请求时,从缓存获取数据的命中率更高,减少对数据库的直接访问,进一步提升性能。比如社交平台用户动态展示,缓存包含冗余用户信息的动态数据块,可快速响应前端展示需求。