SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 05.08.2014 17:03:45

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Долго выполняется DELETE

Сервер Percona 5.6.19-67.0, в какой-то момент одно ядро проца загружается на 100%, длятся такие зависания минут 5. SHOW FULL PROCESSLIST; показал что в этот момент выполняется запрос:
| 459 | bd_user | 192.168.1.4:50681 | blndb | Query   |  663 | updating | DELETE FROM `acclist` WHERE `regtime`!='1407241502' | 0 | 941192636 |
(Rows_sent соответственно 0, Rows_examined - 941192636).
У остальных запросов состояние "Waiting for table level lock".
Таблица acclist:

Rows: 81037
Table Type: MEMORY
Row Format: Dynamic
Index Length: 12,58 MB (13 189 468)
Data Length: 62,77 MB (65 819 744)

CREATE TABLE `acclist` (
  `id` mediumint(4) unsigned NOT NULL DEFAULT '0',
  `regtime` bigint(20) unsigned NOT NULL,
  `name` varbinary(100) NOT NULL,
  ...
  PRIMARY KEY (`id`,`regtime`,`name`),
  UNIQUE KEY `id` (`id`,`name`) USING BTREE,
  KEY `id2` (`id`,`regtime`) USING BTREE,
  KEY `id3` (`regtime`) USING BTREE
) ENGINE=MEMORY DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=256;

Этот запрос проходит около 300 раз в сутки, и обычно выполняется менее чем за секунду.
В чем может заключаться причина такого долгого выполнения?

Неактивен

 

#2 05.08.2014 23:37:33

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

Re: Долго выполняется DELETE

Сколько реально строк удаляется? Для чего используется ROW_FORMAT=COMPRESSED?

Неактивен

 

#3 06.08.2014 11:31:22

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Долго выполняется DELETE

Удаляется не более половины от общего количества, т.е. тогда это было максимум 40518 строки. ROW_FORMAT=COMPRESSED на MEMORY равноценен Dynamic. Вчера сервер на этом запросе так завис 3 раза и 213 этих же запросов прошли без зависаний.

Отредактированно gif-t (06.08.2014 11:34:32)

Неактивен

 

#4 06.08.2014 12:01:01

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

Re: Долго выполняется DELETE

Похоже на deadlock. Какая-то бага не позволяет ему продолжить работу. Возможно, другой тред взял блокировку для записи в эту же таблицу, а теперь ждет выполнения DELETE. В MEMORY могут быть баги в реализации одновременности. Попробуйте перевести таблицу в Innodb (с innodb_file_per_table).

Неактивен

 

#5 07.08.2014 21:11:13

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Долго выполняется DELETE

rgbeast написал:

Похоже на deadlock.

Мне тоже так кажется. Будто пытается пройти транзакция, которая каждый раз не проходит и циклически перезапускается сначала. Но если у всех остальных запросов статус Waiting for table level lock, получается этот DELETE залочил таблицу и транзакция вроде как должна пройти без проблем.

rgbeast написал:

В MEMORY могут быть баги в реализации одновременности. Попробуйте перевести таблицу в Innodb (с innodb_file_per_table).

На Innodb не хотелось бы, т.к. таблица используется как буфер. Она переписывается почти каждую секунду и потеря данных абсолютно не критична.
Сегодня из 273 таких DELETE запросов зависло 4, первый на 167 секунд, второй на 105, третий на 204 и четвертый на 320.
Никакой зависимости в передаваемых цифрах я пока не наблюдаю. Единственное что у этих запросов явно неадекватно - значение Rows_examined всегда девятизначное число, которое, как я полагаю, не должно превышать количество строк в таблице. А пиковое сегодня в таблице было всего 221394 строк. Rows-affected - это, как я понял количество удаленных строк, на этих запросах колеблеца от 1392 до 3463.
Может в MySQL можно выставить лимит на время запроса или значение Rows_examined?

Неактивен

 

#6 08.08.2014 10:23:21

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

Re: Долго выполняется DELETE

Возможность ограничить время исполнения есть только в будущей MySQL 5.7 ( переменная MAX_STATEMENT_TIME ). Можно использовать внешнюю утилиту из Percona Tools pt-kill, которая убивает запросы, выполняющиеся слишком долго.

Попробуйте все же Innodb. За счет использования буфера это не должно быть серьезной потерей производительности.

Неактивен

 

#7 08.08.2014 23:17:39

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Долго выполняется DELETE

В текущей конфигурации сервер не справится с нагрузкой. С помощью memory таблиц я буферизирую запись на винчестеры. Все инсерты и апдейты произвожу в memory, и через необходимые мне интервалы времени (раз в час или раз в сутки для некоторых таблиц) скидываю на винчестер в innodb таблицы. Года 3 назад благодаря этому шагу 5 серваков заменили на один.
Оставлю пока всё как есть, спасибо.

Неактивен

 

#8 08.08.2014 23:23:28

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

Re: Долго выполняется DELETE

Значит включите pt-kill, чтобы убивал долгие запросы. Это скрипт, его можно настроить под себя.

Неактивен

 

Board footer

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