首页 > 解决方案 > 如果我过滤掉不会在更新中更改的记录,会有什么不同吗?

问题描述

抱歉,如果有人问过这个问题,我找不到。

我有一种情况,我必须根据条件更新一些记录,我的问题是数据库过滤掉已经具有我要设置的值的记录是否有任何区别。

例如,给定下表:

+------+-------+----------+
| 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

非常感谢任何评论。

谢谢!

标签: mysqlsqlperformanceoptimizationsql-update

解决方案


如果你有INDEX(category, Status)(按这个顺序),它可能运行得更快。这是因为索引是“覆盖”的,但只是因为它可以完全从INDEX. 当它找到要更改的行时,它仍然必须获取、更新和存储该行。

如果没有该索引,它将必须获取行以检查两列。在这一点上,在确定该行不需要更新并继续前进之前,没有什么可做的。

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

因此,我预计“复合、覆盖”索引的存在只是整个时间的一小部分。

(我同意NULL价值观会带来惊喜。)

(我建议的索引更可能适用于 InnoDB。MyISAM 很老,维护得不好;我犹豫预测它的行为。)


推荐阅读