Я использую MySQL5.5 с репликацией Master / Slave (1 master, 2 slave).
У меня есть процесс, который запускается раз в неделю и усекает конкретную таблицу. Таблица невелика и содержит всего несколько тысяч записей.
По какой-то причине выполнение TRUNCATE TABLE
команды занимает очень много времени (как на ведущем, так и на ведомом). Выполнение занимает около 400 Кс! Когда он работает на рабе, он заставляет его отставать от Мастера. После TRUNCATE TABLE
финиша все возвращается на круги своя.
Я знаю, что один из рабов не получал никаких чтений во время выполнения, TRUNCATE TABLE
так как его выделенный раб, и процесс, который читает с того раба, был остановлен. Кроме того, на этом ведомом устройстве потребовалось столько же времени.
Вот структура таблицы: http://pastebin.com/qEQB4juR
Любые мысли о том, как я могу ускорить TRUNCATE TABLE?
Ответы:
Использование
TRUNCATE TABLE
таблицы InnoDB требует полной блокировки таблицы, поскольку TRUNCATE TABLE - это DDL (язык определения данных), а не DML (манипуляция данными).Это
DELETE FROM user_engagements;
не поможет, потому что информация MVCC записывается в журналы отмены в ibdata1, и это может удерживать таблицу от опустошения. Если удерживать какие-либо незафиксированные транзакцииuser_engagements
, это также может задержатьTRUNCATE TABLE
.Вы можете переименовать таблицу, чтобы она была немедленно доступна
Это должно повторяться быстро, за исключением последнего утверждения.
Попробуйте!
Если у вас MySQL 5.1.16+,
TRUNCATE TABLE
требуется привилегия DROP . Мой ответ выполняет то, чтоTRUNCATE TABLE
сейчас делает.Если у вас MySQL 5.1.15 и выше, вам нужна привилегия DELETE , которую охватывает мой ответ.
источник
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), я могу удалить их, если это приведет к решению?