Что может заставить TRUNCATE TABLE занимать очень много времени?

9

Я использую MySQL5.5 с репликацией Master / Slave (1 master, 2 slave).

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

По какой-то причине выполнение TRUNCATE TABLEкоманды занимает очень много времени (как на ведущем, так и на ведомом). Выполнение занимает около 400 Кс! Когда он работает на рабе, он заставляет его отставать от Мастера. После TRUNCATE TABLEфиниша все возвращается на круги своя.

Я знаю, что один из рабов не получал никаких чтений во время выполнения, TRUNCATE TABLEтак как его выделенный раб, и процесс, который читает с того раба, был остановлен. Кроме того, на этом ведомом устройстве потребовалось столько же времени.

Вот структура таблицы: http://pastebin.com/qEQB4juR

Любые мысли о том, как я могу ускорить TRUNCATE TABLE?

Ран
источник
Есть ли раздел на столе?
Барбарос Альп,

Ответы:

8

Использование TRUNCATE TABLEтаблицы InnoDB требует полной блокировки таблицы, поскольку TRUNCATE TABLE - это DDL (язык определения данных), а не DML (манипуляция данными).

Это DELETE FROM user_engagements;не поможет, потому что информация MVCC записывается в журналы отмены в ibdata1, и это может удерживать таблицу от опустошения. Если удерживать какие-либо незафиксированные транзакции user_engagements, это также может задержать TRUNCATE TABLE.

Вы можете переименовать таблицу, чтобы она была немедленно доступна

SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE user_engagements_new LIKE user_engagements;
ALTER TABLE user_engagements RENAME user_engagements_zap;
ALTER TABLE user_engagements_new RENAME user_engagements;
DROP TABLE user_engagements_zap;
SET FOREIGN_KEY_CHECKS = 1;

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

Попробуйте!

Если у вас MySQL 5.1.16+, TRUNCATE TABLEтребуется привилегия DROP . Мой ответ выполняет то, что TRUNCATE TABLEсейчас делает.

Если у вас MySQL 5.1.15 и выше, вам нужна привилегия DELETE , которую охватывает мой ответ.

RolandoMySQLDBA
источник
2
Я бы использовал RENAME TABLEинструкцию из нескольких частей вместо ALTER TABLEтого, чтобы сделать переименование атомарным: еще RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; одно соображение : DROP TABLEблокировка LRU_mutex во время сканирования списка LRU и удаления каждой записи - это остановит ваш сервер. Percona Server должен innodb_lazy_drop_tableпомочь с этим, но DROP TABLEвсе еще может занять много времени в файловых системах ext.
Аарон Браун
Может ли быть так, что это truncate tableзанимает много времени из-за разделов в таблице (1000), я могу удалить их, если это приведет к решению?
Ран