我应该在使用字符串替换进行更新时添加WHERE子句

时间:2015-07-28 02:38:18

标签: mysql string replace

我想在整个列上执行字符串替换,将一个短语的所有实例更改为另一个:

UPDATE `some_records`
SET `some_column` = REPLACE(`some_column`, 'foo', 'bar');

由于许多行不包含字符串'foo',因此它们不受此查询的影响,这很好;我只关心包含它的行。我的问题是,有没有理由添加一个WHERE子句来明确地定位将受影响的行? e.g。

UPDATE `some_records`
SET `some_column` = REPLACE(`some_column`, 'foo', 'bar')
WHERE `some_column` LIKE '%foo%';

据我所知,两个查询都有完全相同的效果。第二版有什么优势吗?它是否提供更好的性能或任何其他好处?到目前为止,我还没有找到文件说一个比另一个好。

2 个答案:

答案 0 :(得分:2)

AFAIK,如果你在一个用作WHERE子句中条件的列的索引,它应该加速查找应该更新的行。

如果您没有where子句,则数据库默认从磁盘读取所有行,然后进行替换。对于没有资格进行替换的字符串,这是从磁盘上进行的不必要的查找。

答案 1 :(得分:1)

如果在表上定义了BEFORE / AFTER UPDATE触发器,则查询的不同之处在于是否为表中的所有行触发了触发器,或者仅触发了满足谓词的行。 WHERE子句。

否则,在MySQL中,这两个查询是等价的。如果分配给列的值与列中已有的值相同,则MySQL不会将行计数(或报告)为受UPDATE“影响”。 (其他关系数据库会对“受影响”计数中的行进行计数。

由于LIKE比较中的前导百分号,需要对表中的每一行评估该条件,因此性能不会有任何差异。如果some_records(some_column)上有索引,MySQL可能会选择完整的索引扫描,在某些情况下可能会略快一些。)

如果您熟悉其他关系数据库(Oracle,SQL Server等),那么添加WHERE子句是第二天性。

除了这些问题之外,如果你添加WHERE子句并不重要。

我可以看到因添加WHERE子句而烦恼的原因:

  • 避免触发BEFORE / AFTER UPDATE触发器
  • 其他关系数据库中使用的熟悉模式
  • 可能会提高性能(如果行非常长,如果索引更长,更短,并且只有一小部分行符合条件)