如果这个MySQL UPDATE语句在表变大的时候变得很慢,那么如何加快速度呢?

时间:2014-11-20 05:39:48

标签: mysql sql

我有以下简单的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语句不会很慢吗?如果是,是否有任何解决方案?

2 个答案:

答案 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';