【问题标题】:Creating an 'archive table'创建“存档表”
【发布时间】:2014-01-09 03:29:57
【问题描述】:

我有一个包含任务的表格。一些任务是新的或正在进行的阶段,但其他任务将处于归档阶段,这意味着它们已被处理并且返回它们的机会很低。我在想将存档的任务放在具有相同架构的单独表中是明智的,这样对“当前”任务的查询会更快。对吗?

如果我需要将当前任务与存档任务一起显示(例如在搜索结果中),我将简单地合并这两个表。

这是对的吗?我会获得任何好处吗?我认为这被称为水平碎片。我正在使用 MySQL InnoDB。为了真正获得性能优势,我是否需要对表定义做一些额外的事情?

谢谢!!

【问题讨论】:

  • 你在看什么大小的数据集?尤其是使用一组不错的索引,大多数系统可以轻松处理数百万行(每个表)。

标签: mysql sql performance archive database-fragmentation


【解决方案1】:

具有相同架构的单独表

我不确定这是否是个好主意,请记住,DRY(不要重复自己)。如果您必须更改其中一个的架构,则必须更改另一个的架构,这可能会导致错误。

还有,

过早的优化是万恶之源

您的数据库查询当前运行速度是否太慢?我猜他们不是。

【讨论】:

  • 同意,除非性能有问题,否则不要太担心。如果是,请先查看关于分区;一些 RDBMS 实际上允许相同的查询访问多个分区,对“慢”分区有一些明显的惩罚。仅当您拥有一组真正庞大的数据(并且很可能将其移动到单独的物理框)时,才能将数据物理分离。
【解决方案2】:

Partitioning 是一种可以满足您的特定需求的技术。基本上,您可以根据数据中的度量(例如日期)对数据进行逻辑分离。

但是,如果您不愿意对表进行分区,明智的做法是将任务分成两个表,以提高整体吞吐量假设您需要对当前的表进行频繁的表扫描任务,或者出于任何原因,您不愿意在表上创建索引(例如,由于难以预测查询类型)。在这种情况下,这种分离将有助于将当前任务的表大小保持在最小。因此,可以改进通常需要全表扫描的查询(特别是对于即席查询)。

但是,请注意,随着时间的推移,归档任务表的大小也会增长,这种增长会影响针对该表运行的查询的性能,并且可能需要在该表上创建一些索引档案表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 2017-11-09
    • 1970-01-01
    • 2014-11-04
    • 2018-01-31
    • 2019-07-22
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多