2009-12-08 2 views
2

У меня есть сценарий, в котором у меня есть чрезмерное количество обновлений, которые должны выполняться на некотором тексте (в основном текстовые поля типа 64k, но потенциально также и поля среднего текста, которые, я думаю, могут содержат 4MB?) поля (по существу, поиск и замена на этих полях).Сколько функций SQL Updates слишком много

Вот как я знаю, как это сделать, но я не уверен, что это лучший подход.

Использование 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; 

И как я уже сказал, это может быть десятки тысяч обновлений.

Не имея опыта для этого большого обновления, Мне интересно, есть ли лучший подход к этому или, если десятки тысяч строк на самом деле не проблема (в этом случае вопрос в том, сколько строк будет проблемой).

Спасибо.

+0

Почему у вас есть 'LIMIT 1' в инструкции UPDATE? –

+0

Привычка действительно - я обычно делаю это по моим запросам DELETE только для того, чтобы быть в безопасности. Полагаю, что это не обязательно. – OneNerd

ответ

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%'; 
+0

Я считаю, что это отличный подход. Попробуем попробовать по утрам - это сработает, я отмечу как принятый. Спасибо Тиму! – OneNerd

0

Если вы делаете это делает пиковое использование вы хотите выполнить обновление в пакетном режиме.

Разделить на 1000 единиц партии.

  1. Выполнение обновления для партии.
  2. Сон на несколько минут.
  3. Повторите со следующей партией.
0

Если вы хотите консолидировать инструкции 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. Но иногда вам нужно выполнить преобразование на тысячи строк, что сложнее, чем вы можете разумно сделать в SQL, и в этом случае эта стратегия может быть предпочтительной.

Смежные вопросы