使用deactive status列而不是为mysql性能删除行更好吗?

时间:2012-04-21 16:59:27

标签: mysql database-performance

最近我观看了一段关于mysql中CRUD操作的视频,并且该视频引起了我的注意,注释器声称删除了对mysql索引性能不利的行,而不是我们应该使用状态列。

那么,这两者之间真的有区别吗?

2 个答案:

答案 0 :(得分:2)

删除行确实非常昂贵,比为列设置新值更昂贵。有些人从来没有从他们的数据库中删除一行(尽管有时是由于保留了历史记录,而不是性能方面的考虑)。

我通常会延迟删除:当我的应用需要删除一行时,它实际上并不删除,而是设置状态。然后,在低流量期间,我执行这些删除。

某些数据库引擎需要每隔一段时间压缩一次数据文件,因为它们无法重复使用已删除记录中的空间。我不确定InnoDB是否是其中之一。

答案 1 :(得分:0)

我想策略是删除一行会影响所有索引,而修改'status'列可能不会影响任何索引(因为基数较低,你可能不会索引该列)。

但是,删除行时,对索引的影响很小。填充在填充页面时会影响索引性能,从而导致重建索引。删除不会发生这种情况。使用删除时,索引记录仅标记为删除。

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

您的删除确实需要索引,就像您选择和更新一样,以便快速找到要删除的记录。所以,不要责怪由于MySQL索引性能缺失或错误索引导致的缓慢删除。您的delete语句的WHERE子句应该能够使用索引。使用InnoDB,这对于确保仅锁定单个索引记录而非必须锁定所有记录或范围也很重要。