Какой вариант UPDATE оптимальнее

MooH

Новичок
Какой вариант UPDATE оптимальнее

Нужно обновить несколько записей в таблице. В нужном поле у этих записей поставить одно и тоже значение.
Подскажите, какой вариант более оптимальный с точки зрения нагрузки на сервер.
Таблица имеет индекс по полю key_field
1.
$keys=array(массив значений ключевого поля для замены);
foreach($keys as $value) $where[]='key_field='.$value;
$where_string=implode(' OR ',$where);
$query='UPDATE table SET field1=1 WHERE '.$where_string;
mysql_query($query);

или

2.
$keys=array(массив значений ключевого поля для замены);
foreach($keys as $value)
{
$query='UPDATE table SET field1=1 WHERE key_field='.$value;
mysql_query($query);
}

Что-то мне подсказывает, что второй вариант лучше, потому как в первом варианте, в запросе индекс не будет использован и таблица будет просматриваться целиком, но я не уверен. Или тут еще вариант есть. Не стучите по голове, если туплю совсем.
 

Фанат

oncle terrible
Команда форума
MooH
ты пишешь в форум по Mysql
тебя интересует запрос SQL

почему бы не и писать тогда SQL запрос , а не пхп код?
 

MooH

Новичок
Я пишу в PHP & Mysql
Кажись все правильно.
В первом варианте запрос SQL
Во втором тоже самое но с использованием php
Поправьте если что не так.
 

Фанат

oncle terrible
Команда форума
во втором варианте с использованием php ты получаешь ЗАПРОС SQL

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

убери пхп код из своего вопроса, и оставь только SQL
 

MooH

Новичок
Хорошо, специально для принципиальных перефразирую

1 вариант
UPDATE table SET field1=1 WHERE key_field=12 OR key_field=754 OR key_field=23 OR key_field=1256...

2 вариант

UPDATE table SET field1=1 WHERE key_field=12
UPDATE table SET field1=1 WHERE key_field=754
UPDATE table SET field1=1 WHERE key_field=23
UPDATE table SET field1=1 WHERE key_field=1256
...
 

Фанат

oncle terrible
Команда форума
супер! молодец!
вот так сразу становится понятнее и себе самому, и тем, у кого спрашиваешь.
в мануале написано, что первый вариант быстрее.
и, в принципе, можно самому догадаться - почему
 

walrus

Новичок
практически заставил человека самостоятельно ответить на свой вопрос:)
 

Фанат

oncle terrible
Команда форума
ну нифига.
исходя из его рассуждений, он склонялся к неправильному ответу.
я его заставил только задать вопрос нормально
 

MooH

Новичок
Спасибо.
Я думал, что несколько запросов будет быстрее, потому что по индексу сразу находится нужная запись, а во втором случае просматривается вся база. Может тут есть зависимость от количества обновляемых записей и количества записей в базе?

А тут http://mysql.org/doc/refman/5.0/en/update-speed.html я читал, но не понял.
Нужно заблокировать таблицу и сделать несколько обновлений.
Это как?
LOCK TABLES table
UPDATE table SET field1=1 WHERE key_field=12
UPDATE table SET field1=1 WHERE key_field=754
UPDATE table SET field1=1 WHERE key_field=23
UPDATE table SET field1=1 WHERE key_field=1256

или

LOCK TABLES table
UPDATE table SET field1=1 WHERE key_field=12 OR key_field=754 OR key_field=23 OR key_field=1256...
 

Krishna

Продался Java
Может тут есть зависимость от количества обновляемых записей и количества записей в базе?
Да, есть. Для выборки по проиндексированному столбцу, при превышении по прогнозу определенного процента результирующих строк относительно всех - планировщик нормальной СУБД переключается на полное сканирование.
Конкретный процент уже надо смотреть по субд, но в общем и целом, кажется при 20% использование индексов замедляет, а значительно ускоряет до 2%. Но это речь идет чисто о выборке, без апдейта. С апдейтом может быть немножко по-другому.

-~{}~ 06.04.07 18:28:

З.Ы. Советую поделать EXPLAIN SELECT с этой кляузой, посмотреть юзаются ли индексы.
 

wi

Новичок
При маленьком количестве запросов разница, думаю все же больше в количестве сиволов, которое продется писать программисту.
При большом же количестве запросов я бы распределил это так (от быстро к долго; IMHO):

1. WHERE key_field IN (12,754,23,1256,...)
2. UPDATE table SET field1=1 WHERE key_field=12 OR key_field=754
3. UPDATE table SET field1=1 WHERE key_field=12; UPDATE...

Обычно я такие вещи проверяю разницой во времени между началом и концом операции. Ответ приходит сам собой.
 

walrus

Новичок
Автор оригинала: MooH
Спасибо.
Я думал, что несколько запросов будет быстрее, потому что по индексу сразу находится нужная запись, а во втором случае просматривается вся база. Может тут есть зависимость от количества обновляемых записей и количества записей в базе?

А тут http://mysql.org/doc/refman/5.0/en/update-speed.html я читал, но не понял.
Нужно заблокировать таблицу и сделать несколько обновлений.
Это как?
LOCK TABLES table
UPDATE table SET field1=1 WHERE key_field=12
UPDATE table SET field1=1 WHERE key_field=754
UPDATE table SET field1=1 WHERE key_field=23
UPDATE table SET field1=1 WHERE key_field=1256

или

LOCK TABLES table
UPDATE table SET field1=1 WHERE key_field=12 OR key_field=754 OR key_field=23 OR key_field=1256...
По-моему, тут все понятно написано:
Another way to get fast updates is to delay updates and then do many updates in a row later. Performing multiple updates together is much quicker than doing one at a time if you lock the table.

Делай одним оператором, во время апдейта мускул сам сделает Lock, т.к. это будет рассматриваться как транзакция.
 

MooH

Новичок
Спасибо, всем большое. Мозг вправлен в нужное направление.
Про WHERE key_field IN (12,754,23,1256,...) я вообще не знал.
 
Сверху