2013-05-17 3 views
0

У меня есть таблица MyISAM, которую нужно очищать раз в то время (в общей сложности ~ 5M строк из 12M строк удаляются). После этого мне нужно оптимизировать таблицу, и я знаю, что OPTIMIZE TABLE идет быстрее, если сначала отбрасывать индексы. Проблема заключается в том,Заблокировать таблицу MyISAM для обслуживания

ALTER TABLE t1 DISABLE KEYS; 
--> here 
OPTIMIZE TABLE t1; 
--> or here 
ALTER TABLE t1 ENABLE KEYS; 

MySQL может принять решение обслуживать некоторые другие запросы, то это приводит к нескольким медленным неиндексированных сканирования таблицы, задерживая дальнейшие шаги.

Итак, как мне заблокировать стол для других потоков?

ответ

1

Итак, как мне заблокировать стол для других потоков?

Вы можете использовать LOCK TABLES:

LOCK TABLES t1 WRITE; 

Но, как было отмечено:

Если вы используете ALTER TABLE на заблокированном столе, он может стать разблокирована. Например, если вы попытаетесь выполнить вторую операцию ALTER TABLE, результатом может быть ошибка Table 'tbl_name' was not locked with LOCK TABLES. Чтобы справиться с этим, заблокируйте таблицу снова до второго изменения. См. Также Section C.5.7.1, “Problems with ALTER TABLE.

+0

Похоже, это трюк! Благодарю. "[LOW_PRIORITY] WRITE lock: ... Только сеанс, содержащий блокировку, может обращаться к таблице. Никакая другая сессия не может получить к ней доступ до тех пор, пока блокировка не будет выпущена ..." http://dev.mysql.com/ док/RefMan/5,5/ен/запирание tables.html – CamaroSS

0

MyISAM не поддерживает транзакционную поддержку, так что это невозможно сделать надежно (есть много операций DDL-уровня, которые будут разблокировать молча). Вот почему вы должны планировать техническое обслуживание, как это ночью, чтобы вы не усваивали дополнительную нагрузку в часы работы.

У вас есть XY problem, хотя - вы спрашиваете о саморазвивающемся решении проблемы, с которой вы сталкиваетесь, вместо того, чтобы просить о правильном решении проблемы.

Альтернативные варианты для решения основной проблемы являются:

  • Выполнение очистки гораздо чаще - в небольших партиях нагрузка не должна быть очень заметной
  • Делать OPTIMIZE шаг только в ночное время и уборок часто в течение дня.
  • Поскольку вы считаете, что время простоя приемлемо (как вы предполагаете, запираете себя), вы даже можете подумать о переименовании таблицы временно в течение продолжительности - это доисторический способ гарантировать, что никто другой не коснется стола, но он будет работать.

Если вы опишете вашу актуальной проблемы более подробно мы могли бы быть в состоянии дать лучшие решения.

+0

Благодарим за ответ. Я хотел бы уточнить. Процедура очистки сама по себе не представляет проблемы - она ​​адаптивна и никого не беспокоит. Речь идет о оптимизации таблицы. OPTIMIZE TABLE для MyISAM, как описано в руководстве, «реорганизует физическое хранилище табличных данных и связанных данных индекса», а не воссоздает его, как это делается для InnoDB. И поэтому он ускоряется при первом снижении индексов ... – CamaroSS

+0

Я просто хотел знать, если есть какой-либо способ не позволить кому-либо вмешиваться в эти 3 вопроса. – CamaroSS

+0

Хмм да, у меня MyISAM и InnoDB запутались в 'optimize' внутренних, мои извинения. Я исправлю ответ. –

Смежные вопросы