对不起,如果有人问过这个问题,我找不到。
我有一种情况,我必须根据条件更新一些记录,我的问题是,如果它对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相当老旧,维护不善;我不愿预测它的作用