我有一个像下面这样的数据库表。
我的目的是使用某个事件将其中一行设置为默认值。这意味着,如果使用选择将ID = 5的行设为默认值,则 ID = 2 的行的 isDefault 值将设置为 N < / strong>并且 ID = 5 的行的相同内容将更新为 Y 。
正如我所想,有两种实现方法。在这两种方式中,它需要进行两次数据库事务。
在这两种情况下,首先我们需要遍历整个表格,将 isDefault 字段更新为 N 。如果表格大小增加,遍历整个表格既费钱又费时。
我正在寻找针对此方案的优化解决方案。请让我知道,哪一个更好,为什么?我将很高兴知道任何其他优化的解决方案。
答案 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'列的索引。