Mysql 使用IF()或CASE是否有性能差异
在包含多个子选择的大型UPDATE语句中,我们使用了大量嵌套的IF()语句。我想将这些更复杂的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',
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语句的差异