要盲目更新还是在哪里更新?
我有一张表格,其中包含游戏中有关城市的信息,我们可以在每一回合建立一栋建筑物,并以" usedBuilding"值进行记录。
我每回合都会运行一个将usedBuilding更改为0的脚本,问题是,以下两种方法中哪一种更快,并且实际上与使用哪种方法有关吗?
UPDATE cities SET usedBuilding = 0; UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;
解决方案
如果将usedBuilding编入索引,则使用where子句会更快,因为它将仅访问/更新usedBuilding为true的行。
如果未建立索引,则无论如何都要进行全表扫描,因此不会有太大的区别(任何?)。
似乎要使"更新城市SET usedBuilding = 0;"的交易次数减少。比更具体的查询执行。我能想到的主要原因是,如果列中有多个状态。如果只是布尔值,那会很好,但是我们可能需要花一些时间思考是否总是这样。
索引还可能导致使用WHERE子句提高执行计划的效率。
获得确定答案的最佳方法是在不同情况下使用大量样本数据进行概要分析。
循环尝试两种方式数千次,然后计时!
它可能取决于:此表中实际有多少条记录,以及它们是否都适合内存或者是否必须分页到磁盘。在运行更新之前,多少座建筑物的值为1(我猜这可能是1)。
使用哪种方法都没有关系,但是最短的方法可能会出现最少的错误。我们不编写的代码不会有错误。
除非我们有2%的usedBuilding = 1值之类的内容,否则索引编制完全不会对我们有帮助。
但是,这两个语句在逻辑上是不同的,可能意味着完全不同的意思。
但是如果情况相同,则使用不带where子句的那一个。
这些转折多久发生一次?我们希望该表中有几行?如果答案是"每秒少于一次"和"少于10000",那就别担心了。
当然,除非我们对此有某种学术兴趣。
通常,第二种情况(带有WHERE)子句会更快,因为它不会在未使用的行上引起触发器评估,事务记录,索引更新等。
潜在地取决于0/1值的分布,实际上更新所有行可能比进行比较要快,但这是一个相当简陋的情况。
由于约95%的查询费用是I / O,因此使用WHERE子句不会有任何区别(因为该列未建立索引,并且我们正在执行表扫描),也可能会有很大的差异(如果该列已建立索引,或者表已分区等)。无论哪种方式,它都不会造成伤害。
我怀疑对于我们正在谈论的数据量,我们不会注意到执行计划或者速度上的差异,这使得它充其量只能是学术上的,而过早的优化则是最差的。因此,我建议我们在逻辑上对应用有意义。
我们究竟要多少行?我怀疑对于一个较小的在线游戏,我们真的不在乎。
如果我们要对"城市"表进行多次更新,则最好在一条UPDATE语句中进行全部更新。
对行进行任何更改可能需要与写入整个行一样多的I / O(当然,更新索引列也需要索引写操作除外),因此,我们将因进行多次导致行数众多的UPDATE而失败。
但是,如果我们说的是<1000行,那么我们真的不在乎:)