跳转到主要内容
本指南是社区交流会经验总结系列的一部分。想了解更多真实场景中的解决方案和洞见,可按具体问题浏览 数据库是否被过多的 parts 拖慢了?请参阅 Too Many Parts 社区经验指南。 进一步了解 Materialized Views

10 倍存储反模式

真实的生产环境问题: “我们有一个 materialized view。原始日志表大约有 20 GB,但基于这张日志表的视图却膨胀到了 190 GB,几乎是原始表的 10 倍。出现这种情况,是因为我们为每个属性都创建了一行,而每条日志可能有 10 个属性。” 规则: 如果你的 GROUP BY 生成的行数比它消除的还多,那你构建的就是一个代价高昂的索引,而不是 materialized view。

生产环境 materialized view 健康度验证

此查询可帮助你在创建 materialized view 之前,预测它究竟会压缩数据,还是会导致数据膨胀。请针对实际的表和列运行此查询,以避免出现“190GB 膨胀”这种情况。 它会显示:
  • 低聚合率 (<10%) = 好的 MV,可显著压缩数据
  • 高聚合率 (>70%) = 差的 MV,存在存储膨胀风险
  • 存储倍数 = 你的 MV 最终会变大或变小多少

当 materialized views 开始成为问题时

需要监控的预警信号:
  • 插入延迟升高 (原本耗时 10ms 的查询现在需要 100ms 以上)
  • “parts 过多”错误出现得越来越频繁
  • 插入操作期间 CPU 使用率飙升
  • 此前未出现过的插入超时
你可以使用 system.query_log 跟踪查询耗时趋势,对比添加 MV 前后的插入性能。

视频来源

最后修改于 2026年6月12日