SQL - 根据访问频率拆分大表?

Posted

技术标签:

【中文标题】SQL - 根据访问频率拆分大表?【英文标题】:SQL - split a large table according to how frequently they're accessed? 【发布时间】:2015-07-27 17:05:46 【问题描述】:

我有一个包含 50 个字段的表:

    10 个几乎总是需要的字段。 40 个很少需要的字段。

我粗略地说,(1) 中的字段需要被访问的频率比 (2) 中的字段高 1000 倍。

我应该将它们拆分为具有一对一关系的两个表,还是将它们都放在同一个表中?

【问题讨论】:

也许创建一个视图? 你希望通过分离它们来实现什么?或者换一种说法,你想通过分离它们来解决什么问题?这可能会影响我想的答案。 @Kritner 出于性能原因 相关:***.com/questions/517417/… “访问”是指已阅读还是已修改? 【参考方案1】:

您所描述的过程有时称为“垂直分区”。极端情况下(每个垂直分区一列),这就是列式数据库存储数据的方式。不幸的是(据我所知),Postgres 目前不直接支持垂直分区。

您将数据分成两个表的想法很好。我会注意以下几点:

您需要修改使用额外列的查询以使用第二个表。 (您可以将join 包装到一个视图中,当您需要额外的列时使用该视图。) 如果两个表都有一个连接它们的聚集主键,那么join 应该非常快。 如果要插入/更新/删除数据,则需要注意同步。我认为您可以在组合表格的视图上使用 INSTEAD OF 触发器来处理此问题。 如果某些记录没有额外的列,这可能是空间方面的一大胜利。 如果所有记录和所有列都将被加载到缓存中,那么这可能不是一个大胜利。

在某些情况下,这可能是一个巨大的性能胜利。但是需要额外的手动工作来保持表同步。

【讨论】:

就我而言,(1) 和 (2) 中的字段之间也存在概念上的差异。 (2) 中的字段更像是具有不同编辑表单的该表的“附加设置”。例如,它们不能一起修改,这让生活更轻松。【参考方案2】:

这里确实没有足够的信息来估计(实际上没关系量化)可能带来的好处,但成本非常明确 - 更复杂的代码,更复杂的架构,可能更大总体空间使用情况,以及添加和删除行时的性能开销。

性能改进可能来自于在执行全表扫描时扫描较少量的数据,或者来自于在需要时在内存中找到数据块的可能性增加,以及总体上更小的内存占用,但没有关于类型的具体信息经常执行的操作,以及服务器是否有内存压力,无法给出可靠的建议。

要非常小心,不要因为不确定的性能提升而使系统变得更加复杂。

【讨论】:

在我的例子中,复杂性的增加是有限的,因为 (1) 和 (2) 中的字段在概念上是不同的,这意味着我会将它们描述为两个不同的表。我把它们放在一起的唯一原因是因为 Jeff 的有影响力的帖子 您是否希望潜在的两个表中的行之间存在一对一的关联? 是的,永远不会更多,而且永远不会是空的,所以我也不会在磁盘空间大小上获胜。主要问题是性能方面。这两个选项都同样易于维护。 您是否发现当前架构存在性能问题?

以上是关于SQL - 根据访问频率拆分大表?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中,根据分组创建对并计算它们的频率

尝试根据客户在 SQL 上的购买频率查找客户数量并添加客户的销售额

MYSQL性能优化

SQL性能问题.现在表设计可以把一个大表按类型(各类型字段不相同)拆分成多个小表.拆分后比较方便.

nginx 访问频率控制

将一列拆分为多列,计数频率:“int”对象不可迭代