SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 29.10.2013 14:54:17

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

На что влияет количество заблокированных строк InnoDB?

Сегодня выявил некоторую особенность блокировки. Чищу таблицу логов удаляя по 1000000 (миллион) записей, при этом сайт, работающий с той же БД периодически выдаёт ошибку "mysqli::mysqli(): (08004/1040): Too many connections", пока чисткой не занимался, ни разу такого сообщения никто не видел, но в момент чистки сообщение появляется очень часто.

При просмотре процессов в это же время вижу всего-лишь 2-3 десятка подключений.

1. Хотелось бы понимать зависимость и связь такого поведения, моя логика никак не может этого связать.
2. Ну и собссна как побороть? Уменьшить количество удаляемых записей за раз? Или какие-то конфиги подправить?

ЗЫ При чистке этой таблицы в неё так же активно идёт и запись в это же время.
ЗЫЫ Работаем с XtraDB Cluster через haproxy.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#2 30.10.2013 16:47:44

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

Re: На что влияет количество заблокированных строк InnoDB?

Что дают в этот момент команды:

SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'connections';


too many connections обычно, если второе число достигает первого

Неактивен

 

#3 30.10.2013 20:15:55

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: На что влияет количество заблокированных строк InnoDB?

Вторая команда выдаёт число, превышающее 100 млн и которое постоянно растёт, т.е. я так понимаю это количество отработанных подключений за время работы сервера.

Первая команда выдаёт 214. С такими цифрами я понимаю, что второе число теоритически не может быть меньше или равно первого smile

ЗЫ Команды запускал в обычном режиме, без описанной выше проблемы. Давайте разберёмся со второй командой и тогда можно будет мучать сервер smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#4 30.10.2013 20:46:20

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

Re: На что влияет количество заблокированных строк InnoDB?

Прошу прощения, имел в виду

SHOW STATUS LIKE 'Threads_connected';

Неактивен

 

#5 19.11.2013 15:24:19

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: На что влияет количество заблокированных строк InnoDB?

Дошли руки поэкспериментировать на продакшн сервере sad
Обе команды выдают 214. Что же получается, при удалении записей из таблицы она блокировалась вся целиком? Вставки в эту таблицу висели до тех пор, пока удаление не закончилось.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#6 20.11.2013 12:08:12

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

Re: На что влияет количество заблокированных строк InnoDB?

А какое удаление? Если удаляемые записи нельзя идентифицировать по первичному ключу, то блокируется вся таблица.

Неактивен

 

#7 20.11.2013 19:22:27

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: На что влияет количество заблокированных строк InnoDB?

DELETE FROM `table` WHERE `timestamp`< 'YYYY-MM-DD'
PK в таблице имеется, индекс на `timestamp` тоже, само поле имеет тип TIMESTAMP.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#8 20.11.2013 19:24:55

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

Re: На что влияет количество заблокированных строк InnoDB?

Это применение индекса с нестрогим сравнением и не на первичном ключе, поэтому блокируется вся таблица. Вся таблица не будет блокироваться, если запрос будет вида WHERE id in (1,2,3,4). Кстати, не проблема его разбить на два: SELECT id и DELETE по id.

Неактивен

 

#9 21.11.2013 01:25:23

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: На что влияет количество заблокированных строк InnoDB?

Хм, а ведь при выборке из InnoDB таблиц сначала определяется значение PK, а уже потом ищется запись по этому PK. При удалении такой подход, получается, не используется?

В моём случае записей сотни тысяч, не редко и 1-3 миллиона, вариант с дополнительной выборкой PK тут наверн не совсем подойдёт... Значит, остаётся вариант с уменьшением лимита записей, чтобы таблица блокировалась не на долго.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#10 21.11.2013 01:47:31

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

Re: На что влияет количество заблокированных строк InnoDB?

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

Неактивен

 

#11 21.11.2013 12:15:40

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: На что влияет количество заблокированных строк InnoDB?

Не совсем понял суть последнего сообщения))) Я вижу такое поведение: при удалении записей у меня другие подключения при попытке записать в эту таблицу ждут, пока записи не удалятся.

Вот, нашли в мануале, что инсерты ждут только потому, что движок не знает какой PK им присвоить smile
http://dev.mysql.com/doc/refman/5.5/en/ … locks.html
DELETE FROM ... WHERE ... sets an exclusive next-key lock on every record the search encounters.

Отсюда вопрос, а если использовать не WHERE `id` IN (X,Y), а WHERE `id`<=X, фокус прокатит? Или надо проверять? smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#12 21.11.2013 17:51:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: На что влияет количество заблокированных строк InnoDB?

DELETE будет ставить xlock на каждую строку, которую он потрогает, на вторичном
ключе, по которому делается поиск, и на первичном ключе.

Конкретную проблему поможет полечить, разумеется, LIMIT 10000 и повторение до
победного конца smile

Неактивен

 

#13 21.11.2013 23:58:46

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: На что влияет количество заблокированных строк InnoDB?

paulus написал:

DELETE будет ставить xlock на каждую строку, которую он потрогает, на вторичном
ключе, по которому делается поиск, и на первичном ключе.

Правильно, на каждую удаляемую строку, но инсерты тут при чём? smile Они ж в очередь все становятся и ждут когда же этот магазин уже откроет свои двери)))


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#14 22.11.2013 00:44:06

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

Re: На что влияет количество заблокированных строк InnoDB?

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

Неактивен

 

Board footer

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