MySQL:分区是一种处理删除的好方法吗?

时间:2010-11-06 23:32:13

标签: mysql performance database-design partitioning

我有一个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)
);

我的问题是这会使删除行为变慢吗?现在,当我更改记录的“已删除”字段时,MySQL需要将记录移动到完全不同的分区。这似乎很慢。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:3)

是的,我希望两个状态之间的转换速度较慢,以便在分区之间传递。但是,对现有值的已删除/未删除查询会更快,但不会改进不涉及删除状态的查询。

关于表中最常见的操作是什么,并接受可能存在妥协。

答案 1 :(得分:3)

我过去曾经使用过这种方法的项目,我个人认为这不是最好的方法。我认为最好删除记录。如果您有这样的标志,那么使用您的数据库的每个人都必须了解表中存在的记录可能不是“真实”记录,具体取决于是否设置了已删除的标志。它只是使数据库不那么直观,在我看来更难以使用。

如果您关注性能,我会考虑正确分配您的表空间,您仍然可以使用分区方案。您可以按年份和月份对数据进行分区(如果需要该级别的粒度)以帮助提高性能。

但我会避免删除标志。在我工作的项目上,它刚刚成为一个真正令人头痛的问题。例如,如果有人试图插入另一条与“已删除”的记录完全相同的记录(此处删除表示已删除的标志为true),该怎么办?您是否在现有记录上将已删除设置为false,或者是否插入了另一个全新记录?如果您插入一个全新的记录,那么如何在表上定义主键,因为现在您有2条具有相同键的记录?你是否将deleted作为密钥的一部分?关键是你必须处理所有这些类型的非平凡问题。