【问题标题】:To Update blindly or to Update Where?盲目更新还是在哪里更新?
【发布时间】:2008-09-23 22:27:28
【问题描述】:

我有一张包含游戏中城市信息的表格,您可以每回合建造一座建筑物,并以“usedBuilding”值记录。

每回合我将运行一个脚本,将 usedBuilding 更改为 0,问题是,以下两种方式中哪一种更快,使用哪种方式实际上是否重要?

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;

【问题讨论】:

    标签: mysql optimization sql-update


    【解决方案1】:

    一般来说,第二种情况(使用 WHERE)子句会更快 - 因为它不会在未使用的行上导致触发器评估、事务日志记录、索引更新等。

    可能 - 根据 0/1 值的分布,更新所有行实际上可能比进行比较更快 - 但这是一个相当退化的情况。

    由于约 95% 的查询成本是 I/O,因此使用 WHERE 子句将没有区别(因为该列没有被索引,并且您正在执行表扫描)或巨大的差异(如果该列被索引,或表分区等)。无论哪种方式,它都不会受到伤害。

    我怀疑就您所说的数据量而言,您不会注意到执行计划或速度方面的差异 - 这使得它充其量是学术性的,最坏的情况是过早优化。因此,我建议您选择对您的应用有意义的逻辑。

    【讨论】:

      【解决方案2】:

      如果 usedBuilding 被索引,使用 where 子句会更快,因为它只会访问/更新 usedBuilding 为 true 的行。 如果它没有被索引,那么无论如何你都会进行全表扫描,所以它不会有太大(任何?)区别。

      【讨论】:

        【解决方案3】:

        在循环中尝试这两种方式数千次并计时! 这可能取决于:该表中实际有多少记录,以及它们是否都适合内存或必须分页到磁盘。在您运行更新之前有多少建筑物的值为 1(我猜这可能是 1)。

        使用哪种方式无关紧要,但最短的可能会出错的最少。你不写的代码不能有错误。

        【讨论】:

        • “传统”分析在 RDBMS 领域中通常没有用处。您必须查看查询计划和统计信息,而不是盲目地计时。此外,一般而言,您可以提供给 RDBMS 的更多个数据,它可以代表您进行更好的优化。
        【解决方案4】:

        这些轮回发生的频率如何?您希望此表中有多少行?如果答案是“少于每秒一次”和“少于 10000”,请不要担心。

        当然,除非你碰巧对此有某种学术兴趣。

        【讨论】:

          【解决方案5】:

          似乎要使“更新城市 SET usedBuilding = 0;”的交易数量减少执行比更具体的查询。我能想到的反对这一点的主要原因是,如果您的专栏中有多个州。如果它只是一个布尔值,那很好,但您可能需要花一些时间考虑是否会一直如此。

          使用 WHERE 子句索引还可以提高执行计划的效率。

          【讨论】:

            【解决方案6】:

            获得明确答案的最佳方法是在不同场景下使用大量样本数据进行分析。

            【讨论】:

              【解决方案7】:

              索引对你毫无帮助,除非你有可能 2% 的 usedBuilding = 1 值。

              然而,这两个陈述在逻辑上是不同的,并且可能意味着完全不同的事情。 但如果对于您的情况,它们是相同的,则使用不带 where 子句的那个。

              【讨论】:

                【解决方案8】:

                您将拥有多少行?我怀疑对于一个小型的网络游戏,你真的不在乎。

                如果您要对“城市”表进行多次更新,最好在一个 UPDATE 语句中完成所有更新。

                对一行进行任何更改可能与写入整行所需的 I/O 一样多(当然更新索引列也需要写入索引),因此您会因多次更新而输掉很多行。

                但如果你有

                【讨论】:

                  猜你喜欢
                  • 2023-03-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-06-16
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-05-20
                  • 2014-02-08
                  • 1970-01-01
                  相关资源
                  最近更新 更多