在包含多个子选择的大型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。
答案 0 :(得分:0)
由于函数调用,使用IF
as a function 可能会导致很小的开销。区分不同的唯一方法是在受控环境中计时执行。我仍然不会期待大的变化,而且成千上万的记录现在看起来并不那么大。