Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用IF()或CASE是否有性能差异_Mysql_Sql - Fatal编程技术网

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

Mysql 使用IF()或CASE是否有性能差异,mysql,sql,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',

在包含多个子选择的大型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
会变成这样:

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。

由于函数调用,使用可能会导致较小的开销。区分差异的唯一方法是在受控环境中为执行计时。不过我还是不希望有大的变化,现在数千条记录似乎也没有那么大。

无论是这样还是MySQL文档似乎都没有对这两条记录的性能做太多说明。然而,在这两个地方我都看到了关于应该选择哪一个的讨论,通常给出的答案是让代码更容易阅读的东西。假设逻辑流是相同的,我也不希望有太大的性能差异,但让代码可读也很重要。这可能会对您有所帮助:链接指的是处理结果数据的代码中SQL CASE语句或IF语句的差异