UPDATE vs UPDATE WHERE

时间:2013-12-30 12:31:07

标签: mysql database-performance

我有一个包含许多行的表,我定期想要使用cron将一列设置为0

什么是更快/更少内存消耗,对所有行执行UPDATE(即没有WHERE子句)或只执行UPDATE WHERE mycolumn != 0

1 个答案:

答案 0 :(得分:3)

正如在原帖的评论中所注意到的,它取决于几个方面(索引,数据库引擎,存储介质类型,可用缓存等)。

我们可以做出有根据的猜测:

a)我们应该总是进行全表扫描,除非我们在列上有索引(并且我不建议只是为了这个查询,因为你将惩罚你的在线写入以使离线受益过程);

b)检查值的“成本”通过不写未更改记录的节省而高度摊销(除非数据库隐含地这样做,可能会或可能不会发生)如果大多数记录将为零。

但假设开始堆积,所以我宁愿衡量。为了发挥一点,我:

  • 使用“状态”数字列

  • 创建了一个测试表
  • 填写了几百万条记录(例如,使用类似https://stackoverflow.com/a/17268740/64635中的脚本)

  • 使用不同的值进行设置,然后尝试将UPDATE列添加到0,使用和不使用WHERE

我的结果(可能与您的不同)是WHERE查询更快如果确实很少有非零记录。例如,在用

之一设置表格之后
UPDATE myTable SET myColumn = 1;                /* All values non-zero (1) */
UPDATE myTable SET myColumn = FLOOR(RAND()*10); /* ~90% values non-zero */

WHERE和非 - WHERE更新为0都很慢(并且它们之间没有明显的差异,暗示“a”在上面是真的),而在任何

之后
UPDATE myTable SET myColumn = 0;                      /* All values zero */
UPDATE myTable SET myColumn = IF(id % 500 = 0, 1, 0); /* 99.8% values zero */

UPDATEWHERE的速度非常快(如“b”所示)。

我建议您在设置中尝试这些测试(甚至是其他测试,包括索引,如果您真的希望)(例如,创建一个单独的表并运行这样的测试)并考虑您的数据集(测量/估计%)当您的cron作业运行时将为非零的记录)。请记住,您可能希望针对成本/可用性进行优化(包括您的时间作为成本),而不是在Universe中找到绝对最高性能的解决方案(这可能不符合成本效益),并且您一定会找到最好的解决方案。祝你好运!