带 where 子句的数据库事务成本

Database Transaction Costs with where clause

我有一个如下所示的数据库 table。

我的目的是将其中一行设置为某些事件的默认值。这意味着,如果使用选择将 ID = 5 的行设置为默认值,则将设置 ID = 2 的行的 isDefault 值到 N 并且 ID = 5 的行将更新为 Y.

如我所想,有两种实现方式。这两种方式都需要进行两次DB事务。

  1. isDefault的所有行设置为N,然后将ID = 5的行更新为Y.
  2. isDefault 字段更新为 N 其中 isDefault = Y 然后更新该行ID = 5 到 Y.

这两种情况,首先我们需要遍历整个table,将isDefault字段更新为N。如果 table 大小变大,遍历整个 table 既昂贵又耗时。

我正在寻找针对这种情况的优化解决方案。请让我知道,哪个更好,为什么?如果知道任何其他优化解决方案,我将不胜感激。

你真的不用遍历整个数据库!

情况一:"Set all the rows of isDefault to N and then update the row with ID = 5 to Y.",这绝对是一个糟糕的选择。为什么要将所有行都设置为 N?我们唯一需要做的就是在情况 2 中:

"Update the isDefault field to N where isDefault = Y"。在这种情况下,我们必须锁定所有受影响的行并将它们设置为 N 。如果 B 树类结构中列 isDefault 上的索引,那么这样做的复杂度是 O(log n),如果索引是哈希类型结构,则复杂度是 O(1)(常量)。如果你在'isDefault'列上没有任何索引,你将不得不遍历所有的行,其低得可怕的效率在实践中是不可接受的。

那么优化方案就是情况2,在'isDefault'列上加一个索引。