Edu*_*uca 5 mysql database-performance
我有一个包含许多行的表,我经常想要将一列设置为0使用cron.
什么是更快/更少的内存消耗,UPDATE对所有行(即没有WHERE子句)执行操作或UPDATE仅执行操作WHERE mycolumn != 0?
正如在原始帖子的评论中注意到的那样,它取决于几个因素(索引、数据库引擎、存储介质类型、可用缓存内存等)。
我们可以做出有根据的猜测:
a) 我们应该始终进行全表扫描,除非我们在列上有索引(并且我不建议仅仅为了这个查询而进行全表扫描,因为您将惩罚在线写入以有利于离线进程);
b)如果大多数记录为零,则检查值的“成本”将通过不写入未更改的记录所节省的成本进行摊销(除非数据库隐式这样做,这可能会发生,也可能不会发生) 。
但假设开始堆积起来,所以我宁愿进行测量。为了玩一点,我有:
创建了一个带有“状态”数字列的测试表
将其设置为不同的值,然后尝试将该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 */
Run Code Online (Sandbox Code Playgroud)
更新到 0和WHERE非WHERE更新都很慢(它们之间没有明显的区别,这意味着上面的“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)
withUPDATE的WHERE速度快得惊人(正如“b”所暗示的那样)。
我建议在您的设置上尝试这些测试(甚至其他测试,如果您确实愿意,还包括索引)(例如,创建一个单独的表并运行类似的测试)并考虑您的数据集(测量/估计记录的百分比)当你的 cron 作业运行时将是非零)。请记住,您可能想要优化成本/可用性(包括您的时间成本),而不是寻找宇宙中绝对性能最高的解决方案(这可能不具有成本效益),并且您一定会找到最佳解决方案。祝你好运!