使用deactive状态列而不是删除行对于MySQL性能来说是否更好?

4
最近我观看了一段关于mysql中CRUD操作的视频,其中有一件事引起了我的注意,评论者声称删除行会对mysql索引性能产生不好的影响,因此我们应该使用一个状态列来代替删除操作。
那么,这两者之间真的有区别吗?

不知道,我现在已经删除行很长时间了。 - hjpotter92
2个回答

2
删除行确实是非常昂贵的,比给列设置一个新值更昂贵。有些人从来不从他们的数据库中删除行(尽管有时这是为了保留历史记录,而不是出于性能考虑)。
我通常进行延迟删除:当我的应用程序需要删除一行时,它实际上不会删除,而是设置一个状态。然后在低流量期间执行这些删除操作。
有些数据库引擎需要定期压缩其数据文件,因为它们无法重复使用已删除记录的空间。我不确定InnoDB是否属于其中之一。

0

我想策略是,删除一行会影响所有索引,而修改“状态”列可能不会影响任何索引(因为您可能不会由于低基数而对该列进行索引)。

尽管如此,在删除行时,对索引的影响很小。插入会影响索引性能,当它填满一个页面时,会导致索引重建。这在删除时不会发生。对于删除操作,索引记录仅被标记为已删除。

MySQL稍后(在负载较低时)将从索引中清除已删除的行。因此,删除已经被缓存。为什么要做双倍的努力呢?

您的删除操作需要像选择和更新一样具有索引,以便快速查找要删除的记录。因此,不要把由于MySQL索引性能缺失或错误的索引而导致的缓慢删除归咎于MySQL。您的删除语句的WHERE子句应该能够使用索引。对于InnoDB,这也很重要,以确保只锁定单个索引记录而不必锁定所有记录或范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接