UPDATE vs UPDATE WHERE

Edu*_*uca 5 mysql database-performance

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

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

che*_*rbr 3

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

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

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

b)如果大多数记录为零,则检查值的“成本”将通过不写入未更改的记录所节省的成本进行摊销(除非数据库隐式这样做,这可能会发生,也可能不会发生) 。

但假设开始堆积起来,所以我宁愿进行测量。为了玩一点,我有:

我的结果(可能与您的结果不同)是,如果确实很少有非零记录,则WHERE 查询会更快。例如,在使用以下任一方法设置表格后

UPDATE myTable SET myColumn = 1;                /* All values non-zero (1) */
UPDATE myTable SET myColumn = FLOOR(RAND()*10); /* ~90% values non-zero */
Run Code Online (Sandbox Code Playgroud)

更新到 0和WHEREWHERE更新都很慢(它们之间没有明显的区别,这意味着上面的“a”是正确的),而在任何之后

UPDATE myTable SET myColumn = 0;                      /* All values zero */
UPDATE myTable SET myColumn = IF(id % 500 = 0, 1, 0); /* 99.8% values zero */
Run Code Online (Sandbox Code Playgroud)

withUPDATEWHERE速度快得惊人(正如“b”所暗示的那样)。

我建议在您的设置上尝试这些测试(甚至其他测试,如果您确实愿意,还包括索引)(例如,创建一个单独的表并运行类似的测试)并考虑您的数据集(测量/估计记录的百分比)当你的 cron 作业运行时将是非零)。请记住,您可能想要优化成本/可用性(包括您的时间成本),而不是寻找宇宙中绝对性能最高的解决方案(这可能不具有成本效益),并且您一定会找到最佳解决方案。祝你好运!