MySQL UPDATE语句性能

时间:2013-11-27 10:04:11

标签: mysql performance query-performance

在一个行数超过1000万的表上,其中一个UPDATE语句可能会更快,或者它们是不是很多?

  1. UPDATE table SET col1 = col2 WHERE col1 IS NULL;
  2. UPDATE table SET col1 = col2 WHERE col1 IS NULL AND col2 IS NOT NULL;
  3. col1col2都不是键或索引。它们实际上是datetime字段,如果这会改变任何内容。


    注意:我很确定查询会得到相同的结果:

    查询1.每次都会更新col1,包括NULL col2 is NULL时将其设置为col1

    查询2.仅当col2有值时才会更新col1,如果NULL,则col2 is NULLcol1

    他们都以同样的方式改变数据。当NULL时,一个设置 col2 is NULLcol1,其他设置<{strong> NULL col2 is NULL {1}},但在所有情况下col1都以NULL开头。

4 个答案:

答案 0 :(得分:1)

绩效比猜测的更好。然而,这是我的猜测: 这在很大程度上取决于您对 indeces 的使用情况以及基数

这意味着:如果col2有一个包含数千个不同值的索引并且其中一个为null,那么它将比查询1更快。如果没有查询且col2几乎总是为空,则它将更慢。 / p>

如果您有两列索引跨越两个列,并在where-part 中使用两个列,则可以获得最佳性能。

答案 1 :(得分:0)

实际上取决于不同的因素。

UPDATE table SET col1 = col2;

无论如何都会进行全表扫描和修改。

这些查询

UPDATE table SET col1 = col2 WHERE col1 IS NULL;
UPDATE table SET col1 = col2 WHERE col1 IS NULL AND col2 IS NOT NULL;
如果col1和col2被索引,

将导致更快的操作。

如果执行

,您可以获得有关在哪种情况下执行的操作的信息
EXPLAIN UPDATE table SET col1 = col2;
EXPLAIN UPDATE table SET col1 = col2 WHERE col1 IS NULL;
EXPLAIN UPDATE table SET col1 = col2 WHERE col1 IS NULL AND col2 IS NOT NULL;

答案 2 :(得分:0)

根据我的经验,第二种格式通常更可取,但当然这取决于您的数据。请务必注意,相关列上的索引可能不包含空值,具体取决于数据库提供程序和索引的定义方式。即使定义了索引,它们也可能无法提高性能,并且根据您的统计信息,它们可能根本不会被使用。

答案 3 :(得分:0)

回应各种评论&amp;关于测量而不是猜测的答案,以及关于col2 is NULL vs col2具有某种值的行数的评论,我在测试表上运行了4次测试:

                            | Query 1          | Query 2
 col2 almost all NULL       |  5 min 27.96 sec |  4 min 20.38 sec
 col2 almost all has values | 34 min 31.64 sec | 32 min 31.54 sec

结论: 在两种情况下,查询2都略快一些