SQL where子句加速

时间:2017-01-20 20:16:34

标签: mysql sql

此查询

UPDATE table
SET stringcol = REPLACE(stringcol, 'tester1', 'tester2')
WHERE stringcol LIKE '%tester1%'

的运行速度几乎是这个的两倍(在大桌子上)

UPDATE table
SET stringcol = REPLACE(stringcol, 'tester1', 'tester2')

其中仅省略了WHERE子句。

我认为这是一个非常奇怪的结果。

在第一个查询中,数据库必须首先搜索表中的每个stringcol,以查找tester1的出现次数。然后,表的简化子集将传递给REPLACE函数,该函数需要再次查找tester1才能替换它。

在第二个查询中,数据库引擎必须搜索表中的每个stringcol,发现tester1,并相应地替换。

如果有的话,我希望第一个查询运行得更慢,因为WHERE子句和REPLACE函数都会检查tester1的出现次数。

我想我对数据库如何处理查询的分析太简单了。有人可以解释性能上的差异吗?

1 个答案:

答案 0 :(得分:1)

没有WHERE子句的查询将替换应用于表中的每个行。这意味着对于每个记录,您将锁定磁盘区域,其中为该行存储stringcol并获取内容,执行替换并将其写回。根据数据库的不同,即使数据没有变化,也可能会出现这种情况。这可能很聪明,因为可能需要更长的时间来验证是否存在更改而不是将其写入磁盘。此外,由于单个语句正在更新每个记录,因此DB将为每个更改创建一个事务日志。

添加WHERE子句至少会在进行更改之前过滤每一行。即使LIKE '%value%'不使用索引,DB也会在获取锁定并更新值之前检查字段的值。这可能会导致锁定的行数和应用的更改量大幅减少。