执行更新大量行的查询的哪种方法更快?
第一个查询示例会将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
答案 0 :(得分:3)
你的两个UPDATES
做了很多不同的事情并且都使用WHERE
条款,所以任何速度比较都是无用的。第一个检查7天期间和类型为NULL,而第二个检查第二个条件。它们可能会影响大量不同的数据(编辑显示)。
问哪个更快更类似于说“我有一辆自卸卡车和一辆法拉利。哪个更快?” - 答案取决于你是要移动10吨沙子还是零到60来合并成公路交通。您的UPDATE
性能没有任何意义 - 这取决于您实际想要UPDATE
的哪些行。使用那个你真正想做的事情,不要再担心哪个更快。
在执行会影响很多行的UPDATE
或DELETE
之前,使用相同的SELECT
子句运行WHERE
始终是个好主意将要更新的数据是您所期望的。当您第一次意识到您将要执行导致重大问题的错误条件UPDATE
或导致丢失有价值数据的DELETE
时,您会感激不尽。