有多少SQL更新函数太多了

时间:2009-12-08 02:31:33

标签: php mysql

我有一个场景,我必须对某些文本执行过多的更新(大多数是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;

正如我所说,这可能是成千上万的更新。

没有大量更新的经验,我想知道是否有更好的方法,或者,如果数万行不是真正的问题(在在哪种情况下,问题是,有多少行是一个问题。)

感谢。

3 个答案:

答案 0 :(得分:3)

我不是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%';

答案 1 :(得分:0)

如果您正在执行高峰使用,则需要批量执行更新。

分成1000个单位批次。

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

答案 2 :(得分:0)

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

e.g:

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中合理的行更复杂,在这种情况下,此策略可能更为可取。