【发布时间】:2015-10-18 10:18:27
【问题描述】:
我想对整列执行字符串替换,将一个短语的所有实例更改为另一个:
UPDATE `some_records`
SET `some_column` = REPLACE(`some_column`, 'foo', 'bar');
由于许多行不包含字符串 'foo',它们将不受此查询的影响,这很好;我只关心包含它的行。我的问题是,是否有任何理由添加 WHERE 子句来明确定位将受到影响的行?例如
UPDATE `some_records`
SET `some_column` = REPLACE(`some_column`, 'foo', 'bar')
WHERE `some_column` LIKE '%foo%';
据我所知,这两个查询的效果完全相同。 2nd版本有什么优势吗?它是否提供更好的性能或任何其他好处?到目前为止,我还没有找到说明其中一个比另一个更好的文档。
【问题讨论】:
-
如果在表上定义了 BEFORE/AFTER UPDATE 触发器,查询的区别在于触发器是针对表中的所有行触发,还是只针对满足 WHERE 中谓词的行触发条款。否则,在 MySQL 中,这两个查询是等价的。由于 LIKE 比较中的前导百分号,需要对表中的每一行评估该条件,因此性能不会有任何差异。如果
some_records(some_column)上有索引,MySQL 可能会选择全索引扫描,这可能会稍微快一些。) -
@spencer7593 我认为这应该是一个答案而不是评论:)