【问题标题】:Should I add a WHERE clause when updating with string replacements使用字符串替换更新时是否应该添加 WHERE 子句
【发布时间】: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 我认为这应该是一个答案而不是评论:)

标签: mysql string replace


【解决方案1】:

如果在表上定义了BEFORE/AFTER UPDATE 触发器,则查询的区别在于触发器是针对表中的所有行触发,还是仅针对满足 WHERE 子句中的谓词的行触发。

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

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

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

除了这些问题之外,是否添加 WHERE 子句并不重要。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多