SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 20.06.2012 13:08:42

afrokick
Участник
Зарегистрирован: 20.06.2012
Сообщений: 10

Блокировка таблицы при Update в Innodb

Добрый день. Есть некая таблица пользователей. Есть 6 полей, которые нужно два раза обновить полностью по всей таблицы.

При 50 000 проблем с обновлением не было. Но сейчас 250+ появилась: при обновлении таблица блокируется(как я понял), и не выполняется запрос Update от пользователей. Как решить эту проблему, чтобы при обновлении сервером всей таблицы она не блокировалась? Или может есть другой способ...

UPDATE Characters SET yeday_money=today_money, yeday_ranking=today_ranking, yeday_brains=today_brains;
UPDATE Characters SET today_money=0, today_ranking=0, today_brains=0

viewer_id int(11) PRI

today_money int(11) NO MUL 0
today_ranking int(11) NO MUL 0
today_brains int(11) NO MUL 0

yeday_money int(11) NO MUL 0
yeday_ranking int(11) NO MUL 0
yeday_brains int(11) NO MUL 0

Отредактированно afrokick (20.06.2012 13:20:21)

Неактивен

 

#2 20.06.2012 13:29:14

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

Re: Блокировка таблицы при Update в Innodb

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

Неактивен

 

#3 20.06.2012 13:34:10

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

Re: Блокировка таблицы при Update в Innodb

UPDATE Characters SET yeday_money=today_money, today_money=0, ... ?

Неактивен

 

#4 20.06.2012 13:39:59

afrokick
Участник
Зарегистрирован: 20.06.2012
Сообщений: 10

Re: Блокировка таблицы при Update в Innodb

vasya написал:

UPDATE Characters SET yeday_money=today_money, today_money=0, ... ?

Начал недавно работать, и была мысль, что если так напишу, то может сначала  today_money=0 выполниться, а затем yeday_money=today_money . Развейте мой миф пожалуйста. это ведь не так?)

хмм, обновление выполняю один раз в 24 часа. И нужно пробежаться по всей таблице. Если интервал задавать с помощью LIMIT X,Y, то дело пойдет на лад?

Неактивен

 

#5 20.06.2012 13:46:24

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

Re: Блокировка таблицы при Update в Innodb

http://dev.mysql.com/doc/refman/5.0/en/update.html написал:

Single-table UPDATE assignments are generally evaluated from left to right. For multiple-table updates, there is no guarantee that assignments are carried out in any particular order.

Неактивен

 

#6 20.06.2012 13:54:05

afrokick
Участник
Зарегистрирован: 20.06.2012
Сообщений: 10

Re: Блокировка таблицы при Update в Innodb

rgbeast
понял, спасибо.

Если интервал задавать с помощью LIMIT X,Y, то дело пойдет на лад?

А по этому поводу что скажете?

И еще вопросик. Есть запрос, который возвращает ~20 000 уникальных ключей, и потом я делю на части по 100 и обновляю, использую WHERE id=key1 or id = key2 or id = key3... можно ли как-то объединить два запроса? Мне нужно по-любому возвратить ключи тех, кого обновил. В голове вертится что-то типа

SELECT id FROM characters WHERE UPDATE characters WHERE "условия обновления"

Как быть?

Неактивен

 

#7 20.06.2012 13:59:54

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

Re: Блокировка таблицы при Update в Innodb

afrokick написал:

Если интервал задавать с помощью LIMIT X,Y, то дело пойдет на лад?

Будет меньше время блокировки, может помочь. Но лучше не LIMIT, а диапазон по id - WHERE id>0 and id<100, например.

afrokick написал:

И еще вопросик. Есть запрос, который возвращает ~20 000 уникальных ключей, и потом я делю на части по 100 и обновляю, использую WHERE id=key1 or id = key2 or id = key3... можно ли как-то объединить два запроса? Мне нужно по-любому возвратить ключи тех, кого обновил. В голове вертится что-то типа

SELECT id FROM characters WHERE UPDATE characters WHERE "условия обновления"

Как быть?

Сделать, чтобы UPDATE возвращал что-то в формате SELECT в MySQL нельзя.

Неактивен

 

#8 20.06.2012 14:31:54

afrokick
Участник
Зарегистрирован: 20.06.2012
Сообщений: 10

Re: Блокировка таблицы при Update в Innodb

Возвращаюсь к первому вопросу. При таком запросе

UPDATE Characters SET
yeday_money=today_money, today_money=0,
yeday_ranking=today_ranking, today_ranking=0,
yeday_brains=today_brains, today_brains=0 WHERE
today_money<>0 or today_ranking<>0 or today_brains<>0

не будет уже блокироваться вся таблица? ( мы же вроде как уникальные записи выбираем)?

Неактивен

 

#9 20.06.2012 14:37:36

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

Re: Блокировка таблицы при Update в Innodb

Будет блокироваться. Вся таблица не блокируется, если запрос позволяет легко идентифицировать изменяемые записи по первичному ключу (например id=10 или id>10 AND id<20).

Неактивен

 

#10 20.06.2012 15:04:18

afrokick
Участник
Зарегистрирован: 20.06.2012
Сообщений: 10

Re: Блокировка таблицы при Update в Innodb

Хм, т.е. можно через SELECT выбрать те ид, которые нам нужны, а потом UPDATE сделать для них, и это будет быстрее?

Неактивен

 

#11 20.06.2012 15:07:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Блокировка таблицы при Update в Innodb

Ну да, чем меньше записей обновится, тем быстрее запрос отработается. Ну и конечно, нужно проследить, чтобы сам SELECT быстро отработал.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#12 20.06.2012 15:26:27

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

Re: Блокировка таблицы при Update в Innodb

afrokick написал:

Хм, т.е. можно через SELECT выбрать те ид, которые нам нужны, а потом UPDATE сделать для них, и это будет быстрее?

да, апдейт по конкретным id заблокирует только обновляемые строчки, поэтому предварительный SELECT упростит блокировку.

Неактивен

 

#13 20.06.2012 16:30:54

afrokick
Участник
Зарегистрирован: 20.06.2012
Сообщений: 10

Re: Блокировка таблицы при Update в Innodb

deadka,rgbeast
Спасибо

И еще вопросик назрел) UPDATE ... WHERE id IN(массив) - где-то читал что IN не очень хорош. ТАк ли это и что можно взамен?

Неактивен

 

#14 20.06.2012 20:07:23

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

Re: Блокировка таблицы при Update в Innodb

Если нельзя заменить на RANGE, то как вариант только JOIN с временной таблицей. А чем плохо IN?

Неактивен

 

Board footer

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