【问题标题】:MySQL: is Partitioning a good way to handle deletes?MySQL:分区是处理删除的好方法吗?
【发布时间】:2011-05-06 04:04:01
【问题描述】:

我有一个 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 需要将记录移动到完全不同的分区。看起来可能会很慢。

任何建议将不胜感激。

【问题讨论】:

    标签: mysql performance database-design partitioning


    【解决方案1】:

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

    这一切都是关于表中最常见的操作,并接受可能存在的妥协。

    【讨论】:

      【解决方案2】:

      我过去参与过一个使用这种方法的项目,我个人的感觉是这不是最好的方法。我认为最好只删除记录。当您有这样的标志时,使用您的数据库的每个人都必须了解表中存在的记录可能不是“真实”记录,这取决于是否设置了已删除标志。在我看来,它只会让数据库变得不那么直观,并且更难使用。

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

      但我会避免删除的标志。在我从事的项目中,它变得非常令人头疼。例如,如果有人试图插入与“删除”的记录完全相同的另一条记录怎么办(这里的删除意味着已删除标志为真)。您是在现有记录上将已删除设置为 false,还是插入另一个全新的记录?如果您插入一条全新的记录,您如何定义表上的主键,因为现在您有 2 条具有相同键的记录?您是否将deleted 作为密钥的一部分?关键是您必须处理所有这些类型的重要问题。

      【讨论】:

      • 我曾在使用这种“软删除”方法的系统上工作过。他们想知道总共创建了多少与系统中实际使用了多少。有些东西是基于取代/后续的东西被删除的,但他们希望能够在必要时恢复。只是取决于业务规则,但它会影响资源/驱动空间......
      • @OMG Ponies - 我只记得这是我从事的项目的一场噩梦。如果要保存已删除的数据,我认为更好的方法是使用触发器将记录复制到另一个表中,但我会避免像瘟疫一样删除标记:)。您的里程可能会有所不同。
      • @dcp:移动事物的触发器需要一个重复的表——我当时认识的所有 DBA 都不会在他们的数据模型中允许这样的事情。
      • @OMG Ponies - 我们称之为审计表。所以我会有person和person_audit。 person_audit 表将跟踪对 person 表的插入/更新/删除。这是我喜欢使用的方法,因为它提供了完整的审计跟踪。我还没有看到 DBA 反对它。也许“审计”这个词是让他们对额外的桌子感觉更好的东西:)。无论如何,如果 DBA 反对拥有审计表,我真的不得不质疑它们。
      • 我相信这是一种可行的方法,特别是如果需要某种方式来取消删除。但有时“审计表”方法可能更好……视情况而定。
      猜你喜欢
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多