我有一个有很多行的表,我定期希望使用cron将一个列设置为0。
什么是更快/更少的内存消耗,做一个UPDATE对所有的行(即。(不使用WHERE子句)或只执行UPDATE WHERE mycolumn != 0
发布于 2013-12-31 20:43:20
正如在原始帖子的注释中所注意到的,它取决于几个方面(索引、数据库引擎、存储介质类型、可用缓存内存等)。
我们可以有根据地猜测:
( a)我们应该始终进行全表扫描,除非我们在列上有索引(我不推荐仅仅为了这个查询,因为您将惩罚您的在线写入,以利于脱机进程);
( b)检查这些值的“费用”因不写入未修改的记录而节省的费用(除非数据库隐式地这样做,这种情况可能发生或不可能发生)摊销很高,如果大多数记录将为零。
但是假设开始堆积起来,所以我宁愿用来度量。为了玩一玩,我:
UPDATE。我的结果(可能与您的不同)是,如果确实很少有非零记录的话,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作业运行时非零记录的百分比)。请记住,您可能希望优化成本/可用性(包括您作为成本的时间),而不是在宇宙中找到绝对性能最好的解决方案(这可能不符合成本效益),您肯定会找到最好的解决方案。祝好运!
https://stackoverflow.com/questions/20839633
复制相似问题