删除CASCADE Mysql的最佳实践

时间:2018-02-13 18:01:54

标签: mysql sql

我有一个正在发展的MySQL(innoDB)数据库,有必要为旧行定义清理策略。

我的第一个目的是使用ON DELETE CASCADE选项设置FK,但我不知道是否存在任何性能问题......

有什么建议吗?这是清理旧数据的最佳做法吗?

2 个答案:

答案 0 :(得分:2)

添加新外键时mySql的ON DELETE选项可以设置为3个不同的行为:

  1. RESTRICT(也称为NO ACTION)是mysql中的默认行为,将停止该过程并抛出错误。
  2. 只要删除,
  3. SET NULL会将外键值设置为null。 (这将保留数据库中的条目)
  4. CASCADE将完全删除数据库中的外键以及与之相关的每个条目。
  5. 警告:只有在您确定需要删除数据时才使用CASCADE行为,如果它们与任何内容无关。 (例如:评论博客的帖子......

    从技术上讲,我不是数据库性能优化方面的专家,但SET NULL选项似乎可以最大限度地提高性能,而CASCADE最大化存储空间。

答案 1 :(得分:2)

首先有太多行,从来没有理由删除行。这可能是获得更好硬件的原因。

因此清理策略应该是删除不再用于业务目的的行。在确定这些行时,通常更有可能要归档不删除,以便数据将是如果您需要进行历史研究,可以使用。从数据库中删除行应该非常罕见。

因此,在创建策略时,您可以做几件事。首先定义保存每种类型数据的业务需求。也许您只需要查看过去一年的数据,也许是最后五年,这取决于业务需求。也许您只想看到活跃的客户,或者想要删除一年中愿望清单中的项目。如果不了解数据的业务含义,没有人可以帮助您设计删除策略。

在删除级联上使用清理数据是一件特别糟糕的事情,因为它不会区分您希望FK停止删除的数据以及您尝试完全清除的数据。如果您要删除大量记录并拥有大量FKS,它也可以将您的系统与任何处理相关联一段时间。此外,删除时不必考虑数据的含义以及保留数据的原因,这是丢失所需数据的可靠途径。没有简单的快速修复方法来确定要保留的内容以及要归档或删除的内容。因此,不要将其作为首选。

可能最适合您的是创建存档表并将旧数据手动移动到它们中。您可以告诉父表上的FK与哪些数据相关(假设您使用FK正确设计而不是让应用程序处理所有这些(总是一个糟糕的选择。)。或者您可以在许多系统中对数据进行分区以保持但是,您可以使用视图来仅访问最新的数据,如果设计正确,也可以在不删除任何数据的情况下提高性能。或者您可以将所有数据移动到数据仓库并设计流程删除特定时间段内的所有数据。

如果您选择删除数据,请务必先对数据库进行完整备份,然后将其存储在异地。

您会惊讶于旧数据可能会在以后再次困扰您。目前,我正致力于为前客户参与的法律案件提供近20年的数据回收。 (我在一个受到高度监管的行业工作。但我们从不删除任何内容,我们的存档服务器中都提供了所有过去的数据。所以这对我们来说不是问题。)如果您有可能在受监管行业工作(例如财务或医疗保健或警察工作或国防工业)或将来可能有法律行动,不要删除数据,将其存储在档案中。这是在考虑删除任何数据之前理解业务需求至关重要的一个原因。

相关问题