2

这个问题说明了一切。

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

据我了解,当更改标志时,必须将一行移动到正确的分片。

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

我考虑过不立即移动该行,而只是在一天/周/月结束时,但随后不确定,具有特定标志的行驻留在哪个分片中,并且必须始终对所有分片进行搜索。

编辑:一些澄清:

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

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

现在,作为我的分片标准的标志发生了变化,我想知道处理这种情况的最佳方法。如果我只是将记录保留在其原始数据库中,最终所有数据都会累积在一个表中。

4

2 回答 2

2

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

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

  • 快速查找行
  • 在所有分片实例上分配 IO。
  • 无需将数据从一个分片移动到另一个分片(您想要增加分片数量的情况除外)。
于 2010-12-27T07:03:56.607 回答
1

分片通常是指将它们分开在不同服务器上的不同数据库中。Oracle 可以使用称为分区表的功能来做您想做的事情。

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

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

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

于 2008-11-20T15:25:21.480 回答