MyISAM - Блокировка всей БД вместо 1 таблицы

Neborya
Дата: 08.01.2013 07:32:21
Проблема полностью аналогичная той, что описана в этой теме: http://www.sql.ru/forum/actualthread.aspx?tid=719995
К сожалению, там никто не предложил решения, поэтому копирую пост автора.

Mysql 5.0.32 на Debian
Таблицы - все MyISAM
Сервер - 1 CPU, RAM 4GB
Кеши и буферы в my.cnf настроены
Все запросы выполняются под одним юзером с разных хостов

Столкнулся с очень непонятной для меня ситуацией:
Запрос SELECT или REPAIR TABLE или OPTIMIZE TABLE, или даже выполнение Хранимой процедуры и т.д., выполняемый на одной таблице - блокирует все остальные SELECTы или UPDATE, которые даже никак не связаны с этой таблицей.

Например, выполняется ХП, она обращается к двум таблицам (tab1 и tab2), может задержать запрос к tab3, и пока не закончится выполнение ХП, select из tab3 так и будет висеть.

Или например идёт REPAIR TABLE picture (или OPTIMIZE ), при этом невозможно считать из product.
picture весьма тяжелая - 14ГБ, полмиллиона записей, optimize выполняется 400 сек - вся база висит и ждет пока не закончится обработка picture.

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

Перейти на InnoDB пока нет возможности - используется FULL TEXT SEARCH и прикручивать Sphinx тоже пока нельзя.

Кто нибудь встречался с такой проблемой? В какую сторону копать?


В 2 словах вопрос звучит так: почему при операции с одной таблицей MyISAM блокируются ВСЕ таблицы в данной БД, и как этого можно избежать?
miksoft
Дата: 08.01.2013 13:59:01
Могу предположить, что происходит не логическая блокировка, а просто резко возрастает время выполнения других запросов, т.к. уже начавшийся запрос полностью занимает и единственное ядро CPU и, скорее всего, весь физический ввод/вывод. Т.е. дело в нехватке ресурсов.
Neborya
Дата: 08.01.2013 17:17:31
Возможно, правда в моём случае ядер 4.
ScareCrow
Дата: 08.01.2013 18:53:04
автор
при операции с одной таблицей MyISAM блокируются ВСЕ таблицы в данной БД

"мамой клянусь", да.

вы бы хоть статус таблиц посмотрели ради приличия.
Neborya
Дата: 09.01.2013 00:22:53
Что ещё за приличия? :)

Мне достаточно того, что запросы к таблице не выполняются до тех пор, пока висит OPTIMIZE другой таблицы.

Show table status причину этого не объясняет.
bochkov
Дата: 09.01.2013 03:27:51
Погуглив немного увидел,что что пиндосы или кто там,
тоже сталкивались с такой проблемой в MyISAM,
ссылка
один говорит что увеличение key_buffer_size помогает
We recently had a similar problem. Initially our key_buffer_size was set to 1GB. Increasing that to 10GB reduced the problem

хотя они тоже помоему так и не решили эту проблему