2009-09-21 2 views
0

У меня есть скрипт, который обновляется каждую неделю. У меня есть предупреждение с моего хостинга, что я перегружал сервер скриптом. Проблема, я собрал в том, что я использую слишком много запросов UPDATE (по одному для каждого из моих 8000+ пользователей).Добавление обновлений SQL-запросов

Плохое кодирование, я знаю. Поэтому теперь мне нужно объединить все данные в один SQL-запрос и обновить все сразу. Надеюсь, именно это и исправит мою проблему.

Быстрый вопрос. Если добавить чисто добавить UPDATE запросов, разделенных точкой с запятой, как это:

UPDATE table SET something=3 WHERE id=8; UPDATE table SET something=6 WHERE id=9; 

А затем обновить базу данных с одного большого кода SQL, в отличие от запросов к базе данных для каждого обновления, это будет быстрее, не так ли?

Это лучший способ «сгруппировать» вместе заявления UPDATE? Это значительно снизит нагрузку на сервер?

+0

У вас есть хранимые процедуры, доступные для вас? –

+1

Почему вы должны это делать? Если вы можете объяснить сценарий, лучшее решение может возникнуть. – shahkalpesh

+0

Я запускаю http://www.tweekly.fm. Это mashup, который отправляет твиты каждую неделю с last.fm. Поэтому каждую неделю я обновляю данные и отправляю твиты. Я храню имена групп для пользовательских страниц. Вот почему я должен обновлять пользовательские данные каждую неделю. –

ответ

0

Это улучшит IO, так как есть только одна поездка туда и обратно, но база данных «усилие» будет одинаковой.

1

Лучше всего вместе эти заявления своей области «что-то»:

UPDATE table SET something=3 WHERE id IN (2,4,6,8) 
UPDATE table SET something=4 WHERE id IN (1,3,5,7) 

Конечно, ничего не зная о ваших требований, то, вероятно, лучшее решение там ...

+0

Нет, извините. Это не сработает. Каждый пользователь имеет уникальные данные ... –

+0

Затем вам нужно делать с ним уникальные вещи, и в этом случае вам нужны уникальные запросы. Время, чтобы вытащить свою кредитную карту и позвонить своему провайдеру хостинга! –

2

Создайте файл с разделителями с вашими значениями и используйте эквивалент MySQL LOAD DATA INFILE. Это будет значительно быстрее, чем ОБНОВЛЕНИЕ.

LOAD DATA INFILE '/path/to/myfile' 
REPLACE INTO TABLE thetable(field1,field2, field3) 
//optional field and line delimiters 
; 
0

Любопытство из SQL является то, что следующее выражение целого (1 -abs (знак (A - B))) = 1, если А == В и 0 в противном случае. Для удобства позвольте этому выражению _eq (A, B).

таблица обновления таблицы что-то = 3 * _eq (id, 8) + 6 * _eq (id, 9) где id в (8,9);

будет делать то, что вы хотите, с помощью одного оператора обновления.

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