如果我过滤掉在更新中不会更改的记录,它会产生任何差异吗?



对不起,如果有人问过这个问题,我找不到。

我有一种情况,我必须根据条件更新一些记录,我的问题是,如果它对DB过滤掉已经具有我要设置的值的记录有任何影响。

例如,给定下表:

+------+-------+----------+
| Id   | Status| Category |
+------+-------+----------+
| 1    | 1     | 1        |
| 2    | 1     | 1        |
| 3    | 1     | 1        |
| 4    | 1     | 2        |
| 5    | 0     | 2        |
| 6    | 0     | 2        |
| 7    | 1     | 2        |
+------+-------+----------+

我想设置status = 0 WHERE Category = 2,因为我已经有一对status = 0,我想知道如果我的查询是:

UPDATE table SET status = 0 WHERE category = 2

UPDATE table SET status = 0 WHERE category = 2 AND Status != 0

任何评论都是非常感谢的。

谢谢!

如果您有INDEX(category, Status)(按此顺序),它可能运行得更快。这是因为索引是"覆盖"的,但只是因为它可以完全从INDEX中决定哪些行是感兴趣的。当它找到要更改的行时,它仍然需要获取、更新和存储该行。

如果没有这个索引,它将不得不获取行来检查两个列。此时,在决定不需要更新该行并继续前进之前,没有太多事情要做。

事实证明,UPDATE最昂贵的部分是保存行的旧值,以防出现服务器崩溃行(故意的ROLLBACK)。如果您要更改(不仅仅是检查)一百万行,那么UPDATE将非常慢。

因此,我期望存在那个"复合",覆盖";"索引只是整个时间的一小部分。

(我同意NULL值可能会导致意外)

(我建议的索引更可能适用于InnoDB。MyISAM相当老旧,维护不善;我不愿预测它的作用

最新更新