在一个行数超过1000万的表上,其中一个UPDATE
语句可能会更快,或者它们是不是很多?
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
都不是键或索引。它们实际上是datetime
字段,如果这会改变任何内容。
注意:我很确定查询会得到相同的结果:
查询1.每次都会更新col1
,包括NULL
col2 is NULL
时将其设置为col1
。
查询2.仅当col2
有值时才会更新col1
,如果NULL
,则col2 is NULL
为col1
。
他们都以同样的方式改变数据。当NULL
时,一个设置 col2 is NULL
到col1
,其他设置<{strong> NULL
col2 is NULL
{1}},但在所有情况下col1
都以NULL
开头。
答案 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都略快一些。