将数据行移动到另一个分片的最佳方法?

时间:2008-11-16 18:01:29

标签: database language-agnostic sharding

这个问题说明了一切。

示例:我打算对数据库表进行分片。该表包含标记为“活动”,“已完成”和“已删除”的客户订单。我还有三个分片,每个标志一个。

据我所知,当标志被更改时,必须将行移动到右边的分片。

我是对的吗? 最好的方法是什么? 可以使用触发器吗?

我想过不立即移动行,但只是在一天/周/月末,但是没有确定,在哪个碎片中有一个带有特定标志的行,并且搜索必须始终在所有碎片。

编辑:一些澄清:

一般来说,我必须选择一个标准来决定一行所在的碎片。在这种情况下,我希望它是上面描述的标志,因为它是分割这种数据的最自然的方式。 (在我看来)只有有限数量的活跃​​订单可以经常访问。有大量已完成的订单,这些订单很少被访问,并且有大量的数据行几乎从未被访问过。

如果我现在想要特定数据行所在的位置,我不必搜索所有分片。如果用户想要加载活动订单,我知道我必须在哪个数据库中查看。

现在这个标志,我的分片标准,改变了,我想知道处理这个案子的最佳方法。如果我只是将记录保存在原始数据库中,最终所有数据都会累积在一个表中。

2 个答案:

答案 0 :(得分:2)

在我看来,将所有活动记录保存在单个分片中可能不是一个好主意。在这种分片策略中,所有IO都将在单个数据库实例上执行,而其他所有IO都未得到充分利用。

备用分片策略可以是使用某种散列函数在分片中分配新创建的行。这将允许

  • 快速查找行
  • 在所有分片实例上分发IO。
  • 无需将数据从一个分片移动到另一个分片(除非您想增加分片数量)。

答案 1 :(得分:1)

分片通常是指在不同服务器上的不同数据库中分离它们。 Oracle可以使用称为分区表的功能来执行您想要的操作。

如果你正在使用触发器(在/ before_update / insert之后),这将是一个立即移动,其他方法将导致在第一个碎片(活动)中具有不同类型的数据,直到它被清理。 / p>

我还建议按日期执行此操作(例如,将每个不活动且超过一个月的任何内容移动到另一个“归档”数据库的月工作。)

我想请你重新考虑这样做,如果你这样做是为了提高性能(除非你在这个表中有数TB的数据)。请告诉我们您为什么要分片,我们都会想办法解决您的问题。