首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新和更新

更新和更新
EN

Stack Overflow用户
提问于 2013-12-30 12:31:06
回答 1查看 348关注 0票数 5

我有一个有很多行的表,我定期希望使用cron将一个列设置为0

什么是更快/更少的内存消耗,做一个UPDATE对所有的行(即。(不使用WHERE子句)或只执行UPDATE WHERE mycolumn != 0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-31 20:43:20

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

我们可以有根据地猜测:

( a)我们应该始终进行全表扫描,除非我们在列上有索引(我不推荐仅仅为了这个查询,因为您将惩罚您的在线写入,以利于脱机进程);

( b)检查这些值的“费用”因不写入未修改的记录而节省的费用(除非数据库隐式地这样做,这种情况可能发生或不可能发生)摊销很高,如果大多数记录将为零。

但是假设开始堆积起来,所以我宁愿用来度量。为了玩一玩,我:

  • 创建带有"status“数字列的测试表
  • 用几百万条记录填充它(例如,使用像https://stackoverflow.com/a/17268740/64635中的脚本)
  • 使用不同的值设置它,然后尝试将列设置为0,并使用和不使用UPDATE

我的结果(可能与您的不同)是,如果确实很少有非零记录的话,WHERE查询要快得多。例如,在将表设置为

代码语言:javascript
复制
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“是正确的),而在

代码语言:javascript
复制
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作业运行时非零记录的百分比)。请记住,您可能希望优化成本/可用性(包括您作为成本的时间),而不是在宇宙中找到绝对性能最好的解决方案(这可能不符合成本效益),您肯定会找到最好的解决方案。祝好运!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20839633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档