我有一个包含许多行的表,我定期想要使用cron将一列设置为0
。
什么是更快/更少内存消耗,对所有行执行UPDATE
(即没有WHERE
子句)或只执行UPDATE
WHERE mycolumn != 0
?
答案 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 */
UPDATE
与WHERE
的速度非常快(如“b”所示)。
我建议您在设置中尝试这些测试(甚至是其他测试,包括索引,如果您真的希望)(例如,创建一个单独的表并运行这样的测试)并考虑您的数据集(测量/估计%)当您的cron作业运行时将为非零的记录)。请记住,您可能希望针对成本/可用性进行优化(包括您的时间作为成本),而不是在Universe中找到绝对最高性能的解决方案(这可能不符合成本效益),并且您一定会找到最好的解决方案。祝你好运!