最近我观看了一段关于mysql中CRUD操作的视频,其中有一件事引起了我的注意,评论者声称删除行会对mysql索引性能产生不好的影响,因此我们应该使用一个状态列来代替删除操作。
那么,这两者之间真的有区别吗?
那么,这两者之间真的有区别吗?
我想策略是,删除一行会影响所有索引,而修改“状态”列可能不会影响任何索引(因为您可能不会由于低基数而对该列进行索引)。
尽管如此,在删除行时,对索引的影响很小。插入会影响索引性能,当它填满一个页面时,会导致索引重建。这在删除时不会发生。对于删除操作,索引记录仅被标记为已删除。
MySQL稍后(在负载较低时)将从索引中清除已删除的行。因此,删除已经被缓存。为什么要做双倍的努力呢?
您的删除操作需要像选择和更新一样具有索引,以便快速查找要删除的记录。因此,不要把由于MySQL索引性能缺失或错误的索引而导致的缓慢删除归咎于MySQL。您的删除语句的WHERE子句应该能够使用索引。对于InnoDB,这也很重要,以确保只锁定单个索引记录而不必锁定所有记录或范围。