4

最近我看了一个关于 mysql 中的 CRUD 操作的视频,其中一件事引起了我的注意,评论员声称删除行对 mysql 索引性能不利,而不是我们应该使用状态列。

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

4

2 回答 2

2

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

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

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

于 2012-04-21T17:03:17.000 回答
0

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

尽管如此,当删除行时,对索引的影响是最小的。插入会在填满页面时影响索引性能,从而导致重建索引。删除不会发生这种情况。使用删除,索引记录仅被标记为删除。

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

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

于 2012-04-21T17:35:59.030 回答