Database 带有where子句的数据库事务成本
我有一个如下所示的数据库表 我的目的是通过一些事件将其中一行设置为默认值。这意味着,如果使用SELECT将ID=5的行设为默认值,则ID=2的行的isDefault值将设置为N,ID=5的行的值将更新为Y 正如我所想,有两种方法可以实现这一点。在这两种方式中,它都需要进行两个DB事务Database 带有where子句的数据库事务成本,database,database-performance,Database,Database Performance,我有一个如下所示的数据库表 我的目的是通过一些事件将其中一行设置为默认值。这意味着,如果使用SELECT将ID=5的行设为默认值,则ID=2的行的isDefault值将设置为N,ID=5的行的值将更新为Y 正如我所想,有两种方法可以实现这一点。在这两种方式中,它都需要进行两个DB事务 将isDefault的所有行设置为N,然后将ID=5的行更新为Y 将isDefault字段更新为N,其中isDefault=Y,然后将ID=5的行更新为Y 在这两种情况下,首先我们需要遍历整个表,将isDefau
我正在为这个场景寻找一个优化的解决方案。请让我知道,哪一个更好,为什么?我很高兴知道任何其他优化的解决方案。您真的不必遍历整个数据库 在案例1中:“将isDefault的所有行设置为N,然后将ID=5的行更新为Y”,这肯定是一个错误的选择。为什么要费心把所有的行都设为N呢?我们唯一需要做的就是在案例2中: “将isDefault字段更新为N,其中isDefault=Y”。在这种情况下,我们必须锁定所有受影响的行,并将它们设置为
N
。如果列上的索引是类B树结构中的default
,则执行此操作的复杂度为O(logn);如果索引是哈希类型结构,则复杂度为O(1)(常量)。如果在“isDefault”列上没有任何索引,则必须遍历所有行,其极低的效率在实践中是不可接受的
然后,优化的解决方案是案例2,加上“isDefault”列上的索引。您真的不必遍历整个数据库 在案例1中:“将isDefault的所有行设置为N,然后将ID=5的行更新为Y”,这肯定是一个错误的选择。为什么要费心把所有的行都设为N呢?我们唯一需要做的就是在案例2中: “将isDefault字段更新为N,其中isDefault=Y”。在这种情况下,我们必须锁定所有受影响的行,并将它们设置为
N
。如果列上的索引是类B树结构中的default
,则执行此操作的复杂度为O(logn);如果索引是哈希类型结构,则复杂度为O(1)(常量)。如果在“isDefault”列上没有任何索引,则必须遍历所有行,其极低的效率在实践中是不可接受的
然后,优化的解决方案是案例2,加上“isDefault”列上的索引