目前,我在mysql中有一个记录事务的表。这些事务可能会由用户更新-有时从不更新,有时经常更新。但是,我需要跟踪此表中每个字段的更改。所以,我现在在表中有一个名为' is_deleted‘的TINYINT(1)字段,当用户’更新‘一个事务时,它只是将旧记录的is_deleted字段更新为1,并插入一个全新的记录。
这一切都运行得很好,因为我只需运行以下sql语句来获取所有当前记录:
SELECT id, foo, bar, something FROM trans WHERE is_deleted = 0;但是,我担心这个表会随着时间的推移变得不必要地变大,因此我正在考虑实际删除旧记录并将其‘存档’到另一个表(trans_deleted)中。这意味着trans表将只包含“实时”记录,因此使得SELECT查询速度更快一些。
然而,这确实意味着更新记录将花费更长的时间,因为它将运行3个查询: 1.插入trans_deleted旧记录;2.从trans WHERE WHERE=5删除;3.插入trans新记录
因此,更新记录需要更多的工作,但读取速度会更快。
对此有什么想法吗?
发布于 2010-08-06 20:16:13
我建议使用table trans和table_revision
其中trans具有字段id和current_revision,而revision具有字段id、transid、foo和bar。
要获取所有当前项,请执行以下操作:
SELECT r.foo, r.bar FROM trans AS t
LEFT JOIN revision AS r ON t.id = r.trans_id
WHERE t.current_revision = r.id如果你现在把索引放在r.id和r.trans_id上,存档不会让你的速度变得更快。
发布于 2010-08-06 20:16:48
通常,你读的比写的要多得多(而且你还说有些记录可能永远不会改变)。因此,这是使用归档表的一个原因。
还有另一个问题:您还必须考虑程序员的时间,而不仅仅是处理器的时间:)如果您将存档的行与活动的行放在同一个表中,那么在对该表执行的每个查询中,您都必须记住并注意这一点。更不用说未来的程序员,他们可能不得不处理表...我会推荐仅基于此因素的归档方法,即使没有任何速度改进!
https://stackoverflow.com/questions/3423595
复制相似问题