【问题标题】:How many SQL Updates functions are too many多少 SQL 更新函数太多了
【发布时间】:2009-12-08 02:31:33
【问题描述】:

我有一个场景,我必须对某些文本(主要是 64k 文本类型字段,但可能还有一些中等文本字段,我认为可以包含 4MB?)字段(基本上,对这些字段进行搜索和替换)。

这是我知道的方法,但不确定这是否是最好的方法。

使用 PHP 和 MySql,一般来说,我会做这样的事情(SQL 代码没有包装到 PHP 代码中,但你明白了):

SELECT id, some_text_row FROM table WHERE some_text_row LIKE '%some phrase%'

这可能会返回数万行。

接下来,我会这样做:

$row['some_text_row'] = str_replace( 'some phrase', 
                                     'some other phrase', 
                                     $row['some_text_row'] );
UPDATE table 
SET some_text_row = "{$row['some_text_row']}" 
WHERE id="{$row['id']'}"
LIMIT 1;

正如我所说,这可能是数以万计的更新。

没有这么大的更新经验,我想知道是否有更好的方法来解决这个问题,或者,如果数万行不是真正的问题(在在这种情况下,问题是,有多少行会成为问题)。

谢谢。

【问题讨论】:

  • 为什么在 UPDATE 语句中有LIMIT 1
  • 真的习惯了——为了安全起见,我通常在我的 DELETE 查询中这样做。我想这不是真的必要。

标签: php mysql


【解决方案1】:

我不是 SQL 专家,但您可能想看看 MySQL string functions。它们可能允许您在 SQL 语句中完成所有操作(因为您只是在进行替换)。

类似:

UPDATE `table` 
SET some_text_row = replace(some_text_row, 'some phrase', 'some other phrase') 
WHERE some_text_row LIKE '%some phrase%';

【讨论】:

  • 我相信这是一个很好的方法。早上去试试 - 它有效,我会标记为已接受。谢谢蒂姆!
【解决方案2】:

如果您在使用高峰期执行此操作,您将需要批量执行更新。

分成 1000 个单位批次。

  1. 执行批量更新。
  2. 睡几分钟。
  3. 下一批重复。

【讨论】:

    【解决方案3】:

    如果您想合并 UPDATE 语句,您始终可以批量插入到临时表中,然后在单个语句中从临时表中更新现有表。

    例如:

    CREATE TEMPORARY TABLE my_tmp (id INTEGER, new_value TEXT);
    INSERT INTO my_tmp VALUES (1, 'new string'), (2, 'another new string'), ...;
    UPDATE table SET some_text_row = new_value FROM my_tmp WHERE my_tmp.id = table.id;
    

    如果您正在查看数以万计的更新,这可能会在往返、查询解析等方面为您节省大量时间。

    如果您可以在纯 SQL 中做您需要的事情,Tim 的解决方案绝对是一流的。但有时您需要对数千行执行转换,这比您在 SQL 中可以合理执行的复杂得多,在这种情况下,这种策略可能更可取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2011-02-09
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多