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

Bas*_*scy 5 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),
Run Code Online (Sandbox Code Playgroud)

会变成这样:

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
Run Code Online (Sandbox Code Playgroud)

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

顺便说一下,我们使用的是 MySQL 5.6.19。

Cav*_*vaz 3

使用作为IF函数 可能会因函数调用而产生少量开销。区分差异的唯一方法是在受控环境中对执行进行计时。不过,我预计不会有大的变化,而且现在数千条记录似乎也没有那么大。