我有一个表,包含,比方说,任务。有些任务是新的或处于进行中的阶段,但其他任务将处于存档阶段,这意味着它们已被处理并且返回它们的机会很低。我当时认为将存档的任务放在具有相同模式的单独表中是明智的,这样对“当前”任务的查询就会更快。是不是?
如果我需要使用存档任务(例如搜索结果)启动当前任务,我将简单地将两个表联合起来。
这是对的吗?我会获得任何好处吗?我认为它被称为横向碎片。我正在使用MySQL InnoDB。我是否需要为表定义做一些额外的工作才能真正获得性能优势?
谢谢!
答案 0 :(得分:3)
具有相同架构的单独表
我不确定这是一个好主意,请记住,干(不要重复自己)。如果您必须更改一个架构,则必须更改另一个架构,这可能会导致错误。
另外,
过早优化是万恶之源
您的数据库查询当前运行速度是否太慢?我猜他们不是。
答案 1 :(得分:1)
Partitioning是一种解决像您这样的特定要求的技术。基本上,您可以根据日期等数据中的度量对数据进行逻辑分离。
但是,如果您不愿意对表进行分区,则明智的做法是将任务分成两个表,目的是提高总吞吐量假设,您需要对当前频率进行频繁的表扫描任务或者由于任何原因,您不愿意在表上创建索引(例如,由于难以预测查询类型)。在这种情况下,这种分离将有助于将当前任务的表大小保持在最小。因此,通常需要全表扫描的查询可以得到改进(特别是对于即席查询)。
但是,请注意,随着时间的推移,存档任务表的大小也会增加,这种增长会影响针对此表运行的查询的性能,并且可能需要创建一些索引。档案表。