使用IF()或CASE是否存在性能差异

时间:2017-03-01 08:56:31

标签: mysql sql

在包含多个子选择的大型UPDATE语句中,我们使用了大量嵌套的IF()语句。我想将更复杂的IF()语句重构为CASE语句,主要是为了提高可读性并减少编码错误的变化。

所以声明部分是这样的:

SET cr.Price=IF(cmr.dirty AND rtg.connectRateToMasterRate=0, cr.Price,
                (cmr.price + IF(rtg.RateDeviationType='FIXED_AMOUNT', 
                                rtg.masterRateRateDeviation, cmr.Price * 
                                rtg.masterRateRateDeviation / 100)  
               )) * IF(masterSettings.masterCurrencyConvertActive='TRUE', 
                       cuMaster.AValue / cu.AValue, 1),

会变成这样的事情:

SET
 cr.Price = CASE WHEN cmr.dirty AND rtg.connectRateToMasterRate
                 THEN
                   (cmr.Price +  
                    IF(rtg.RateDeviationType='FIXED_AMOUNT',  
                        rtg.masterRateRateDeviation,  
                        cmr.Price * rtg.masterRateRateDeviation / 100  
                      )  
                   ) * IF(masterSettings.masterCurrencyConvertActive='TRUE',  
                          cuMaster.AValue / cu.AValue,  
                          1  
                         )  
                 ELSE cr.Price  
            END

我的问题是,如果这样的重构会对查询的性能产生影响。请记住,此更新查询将更新数千条记录,因此即使是小幅增加也会产生重大影响。

顺便说一句,我们正在使用MySQL 5.6.19。

1 个答案:

答案 0 :(得分:0)

由于函数调用,使用IF as a function 可能会导致很小的开销。区分不同的唯一方法是在受控环境中计时执行。我仍然不会期待大的变化,而且成千上万的记录现在看起来并不那么大。