我有一个MySQL表:
CREATE TABLE responses (
id INT NOT NULL AUTO_INCREMENT,
other_id INT NOT NULL,
details TEXT,
deleted BOOLEAN,
PRIMARY KEY (id)
);用户可以删除responses中的记录。
我的计划是使用字段deleted来实现删除。每当用户删除记录时,我都会将deleted设置为1。
有时,我可能想要删除所有已删除的记录,或者将它们存档。我正在考虑使用分区来使其更快:
PARTITION BY LIST(deleted) (
PARTITION pActive VALUES IN (0),
PARTITION pDeleted VALUES IN (1)
);我的问题是,这会不会让删除的过程变得更慢?现在,当我更改记录的"deleted“字段时,MySQL需要将记录移动到一个完全不同的分区。这看起来可能会很慢。
任何建议都将不胜感激。
发布于 2010-11-07 07:40:49
是的,为了在分区之间传递,我预计两个状态之间的转换会更慢。但对现有值的已删除/未删除查询会更快,尽管不涉及删除状态的查询不会得到改善。
这一切都是关于表中最常见的操作,并接受可以妥协的事实。
发布于 2010-11-07 07:41:30
我在过去的一个项目中使用了这种方法,我个人的感觉是这不是最好的方法。我觉得还是直接删除记录比较好。当您有一个这样的标志时,使用您的数据库的每个人都必须明白,表中存在的记录可能不是“真实”记录,这取决于是否设置了deleted标志。这只会让数据库变得不那么直观,在我看来也更难使用。
如果您关心性能,我会考虑如何正确地分配您的表空间,您仍然可以使用分区方案。您可以按年和月对数据进行分区(如果您需要该级别的粒度),以帮助提高性能。
但我会避开deleted标志。在我参与的项目中,这真的让人头疼。例如,如果有人试图插入与被“删除”的记录完全相同的另一条记录(此处deleted表示删除标志为真),该怎么办?您是将现有记录上的deleted设置为false,还是插入另一个全新的记录?如果您插入了一个全新的记录,那么您如何在表中定义您的主键,因为现在您有2条记录具有相同的键?你让deleted成为密钥的一部分吗?重点是,你必须处理所有这些类型的非琐碎问题。
https://stackoverflow.com/questions/4115732
复制相似问题