更新整个表或使用WHERE子句更快吗?

时间:2017-09-07 22:47:50

标签: mysql sql

执行更新大量行的查询的哪种方法更快?

第一个查询示例会将points列更新为0,对于7天及之前生成last_visit的每一行。

之后,在这两种情况下,都会有一个额外的查询写入在过去7天内创建last_visit的所有行。

该表现在有大约140,000行。第一个查询更新110.000行,第二个查询更新140.000

UPDATE the_table SET points = 0 where DATE(last_visit) <= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND type is NULL

UPDATE the_table SET points = 0 where type is NULL

1 个答案:

答案 0 :(得分:3)

你的两个UPDATES做了很多不同的事情并且都使用WHERE条款,所以任何速度比较都是无用的。第一个检查7天期间和类型为NULL,而第二个检查第二个条件。它们可能会影响大量不同的数据(编辑显示)。

问哪个更快更类似于说“我有一辆自卸卡车和一辆法拉利。哪个更快?” - 答案取决于你是要移动10吨沙子还是零到60来合并成公路交通。您的UPDATE性能没有任何意义 - 这取决于您实际想要UPDATE的哪些行。使用那个你真正想做的事情,不要再担心哪个更快。

在执行会影响很多行的UPDATEDELETE之前,使用相同的SELECT子句运行WHERE始终是个好主意将要更新的数据是您所期望的。当您第一次意识到您将要执行导致重大问题的错误条件UPDATE或导致丢失有价值数据的DELETE时,您会感激不尽。