SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.09.2012 22:17:57

kacergei
Участник
Зарегистрирован: 04.09.2012
Сообщений: 6

Оптимизация запроса Update

Можно ли как-то упростить данный запрос, но сохранить последовательную структуру (по id):

update table set
`aa`= case  when `id`= 1 then 'asd' ELSE `aa`END,
`bb`= case  when `id`= 1 then 'exc' ELSE `bb`END,
`cc`= case  when `id`= 1 then 'xhi' ELSE `cc`END,
`aa`= case  when `id`= 2 then 'fvx'  ELSE `aa`END,
`bb`= case  when `id`= 2 then 'usb'  ELSE `bb`END,
`cc`= case  when `id`= 2 then 'qsc'  ELSE `cc`END,
`aa`= case  when `id`= 3 then 'ybd' ELSE `aa` END,
`bb`= case  when `id`= 3 then 'bsr' ELSE `bb` END,
`cc`= case  when `id`= 3 then 'hbd' ELSE `cc` END
;

Данный запрос последовтельно изменяет значение полей сразу в 3-х строках, в соответсвии с id. Т.е. сначала строку с id=1, потом с id=2 и id=3.

Неактивен

 

#2 05.09.2012 11:06:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Оптимизация запроса Update

Три запроса при наличии индекса на id будут работать быстрее.

Неактивен

 

#3 05.09.2012 15:05:16

kacergei
Участник
Зарегистрирован: 04.09.2012
Сообщений: 6

Re: Оптимизация запроса Update

Я читал что mysql очень хорошо оптимизирует запросы, и по логике должен сгруппировать по `id`, и еще читал что один update, в случае использования динамических строк, выполняется намного быстрее, т.к. mysql сразу выделяет память под все строки. А в случае поочередных запросов - каждый раз будет происходить выделение памяти и сдвиг уже существующих строк, чтобы освободить место для новой.
Можно ли это всё как-то проверить средствами mysql?

Неактивен

 

#4 05.09.2012 15:21:13

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Оптимизация запроса Update

Такие операции как у вас MySQL не сможет оптимизировать, так как они не типовые. CASE потребует сделать полный скан таблицы. Скорость можно проверить на тестовом приложении - выполните требуемую операцию много раз на достаточно большой таблице.

Неактивен

 

#5 05.09.2012 15:40:14

kacergei
Участник
Зарегистрирован: 04.09.2012
Сообщений: 6

Re: Оптимизация запроса Update

Понятно, т.е. индексы просто не будут использоваться.

Тогда еще три вопроса:
1) Будет ли MySQL в случае объединения update запросов в один перераспределять память для всех апдейтов сразу, или будет для каждого в отдельности? Мне нужно сократить число записей на SSD.
2) Выходит партицирование в таком объединенном запросе тоже работать не будет, будут перебираться все партиции?
3) WHERE id IN (...) задействует индексы? Или всеравно будет перебираться вся база?

Отредактированно kacergei (05.09.2012 16:10:23)

Неактивен

 

#6 05.09.2012 16:23:27

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Оптимизация запроса Update

1) скорее всего в этом случае будет общая запись на диск, но все зависит от того в одном и том же или в разных секторах данные и от механизма хранения - для минимизации записи вам больше подойдет MyISAM
2) партиционирование работает только в части операций, в которых работают индексы. Если индексы не работают, о партиционировании думать не стоит.
3) да, использует индексы

Неактивен

 

#7 06.09.2012 01:46:23

kacergei
Участник
Зарегистрирован: 04.09.2012
Сообщений: 6

Re: Оптимизация запроса Update

Спасибо
Еще такой вопрос, может быть есть какие-то альтернативы MySQL, которые будут отрабатывать в данной задаче оптимально, т.е. и индексы использовать и распределять память под все вставки разом, или поддерживающие множество SET в UPDATE? Я читал есть много форков, может в каком-то что-то такое есть, вы не знаете?

Отредактированно kacergei (06.09.2012 17:24:51)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson