使用where子句

时间:2016-02-13 06:17:21

标签: database database-performance

我有一个像下面这样的数据库表。

Database Table

我的目的是使用某个事件将其中一行设置为默认值。这意味着,如果使用选择将ID = 5的行设为默认值,则 ID = 2 的行的 isDefault 值将设置为 N < / strong>并且 ID = 5 的行的相同内容将更新为 Y

正如我所想,有两种实现方法。在这两种方式中,它需要进行两次数据库事务。

  1. isDefault 的所有行设置为 N ,然后将ID = 5的行更新为 Y
  2. isDefault 字段更新为 N ,其中 isDefault = Y ,然后将ID = 5的行更新为 Y
  3. 在这两种情况下,首先我们需要遍历整个表格,将 isDefault 字段更新为 N 。如果表格大小增加,遍历整个表格既费钱又费时。

    我正在寻找针对此方案的优化解决方案。请让我知道,哪一个更好,为什么?我将很高兴知道任何其他优化的解决方案。

1 个答案:

答案 0 :(得分:0)

您真的不必遍历整个数据库!

在案例1中:“将isDefault的所有行设置为N,然后将ID = 5的行更新为Y.”,这绝对是一个糟糕的选择。为什么要将所有行设置为N?我们唯一需要做的就是案例2:

“将isDefault字段更新为N,其中isDefault = Y”。在这种情况下,我们必须锁定所有受影响的行并将它们设置为N。这样做的复杂性是O(log n),如果B-tree结构中的列isDefault上的索引,或者如果索引是散列类型结构则是O(1)(常量)。如果列'isDefault'上没有任何索引,则必须遍历所有行,其实际上不可接受其可怕的低效率。

然后优化的解决方案是案例2,加上'isDefault'列的索引。