我有以下简单的MySQL UPDATE语句;
UPDATE TableA
SET columnX =
(
CASE
WHEN (ColumnB = 'Criteria_Met')
then ( 0 )
END
);
我担心使用CASE的上述UPDATE语句会很慢。这是因为不符合条件的行将被指定为NULL。见http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html
这意味着如果表有数百万行,则不符合条件的所有行都将被指定为null。如果有很多行,这将花费时间。这样的UPDATE语句不会很慢吗?如果是,是否有任何解决方案?
答案 0 :(得分:2)
如果列已为空,则无需再次更新。所以你可以做类似以下的事情:
UPDATE TableA
SET columnX =
(
CASE
WHEN (ColumnB = 'Criteria_Met')
then ( 0 )
ELSE null
END
)
WHERE columnX IS NOT NULL;
在这种情况下,您只会更新正在更改的行。索引columnX和columnB也是一个好主意,因此可以快速扫描它们。
答案 1 :(得分:2)
怎么样?
UPDATE TableA
SET columnX = 0
WHERE ColumnB = 'Criteria_Met';
符合第一个代码的(即先前columnX为0的任何记录将保持为0)
在这种情况下,我会避免任何“情况”,其中WHERE子句会更高效,特别是如果ColumnB被索引。
如果按照第二个代码的建议考虑必须为所有记录更新columnX,我可能会测试运行两个查询的运行时间:
UPDATE TableA SET ColumnX = NULL;
UPDATE TableA
SET columnX = 0
WHERE ColumnB = 'Criteria_Met';