Если это был я, SMB/CIFS полностью для исправности администратора.
Вы не должны должны быть повторно индексировать MySQL кроме случаев повреждения от катастрофического отказа или внезапного выключения питания. Если у Вас есть проблемы блокировки, можно хотеть изучить преобразовывание таблиц MyISAM (или по крайней мере таблиц с самыми большими проблемами конкуренции за блокировку) к InnoDB. Требуется немного больше RAM, но это поддерживает блокировку уровня строки вместо просто блокировки уровня таблицы (среди многих других улучшений).
Вы также захотите преуспеть и выполнить "шоу полный processlist"; удостоверяться, что это не что-то сознательно явно блокировка таблицы, как своего рода резервное копирование.
Как уже отмечено, выбранный механизм устройства хранения данных является работой MySQL влияния основного фактора. Если Вы используете MyISAM или InnoDB, который зависит от Вашей рабочей нагрузки.
Если в Вашем случае ВЫБОРЫ быстры, чтобы сделать и нет большого действия записи к DB, MyISAM не плох вообще. Но если у Вас есть даже умеренное действие записи и некоторые продолжительные ВЫБОРЫ, знать, что MyISAM только поддерживает блокировки уровня таблицы. Во время медленного ВЫБОРА будет поставлено в очередь все действие записи, и это может довольно скоро привести ко всему виду противных проблем.
InnoDB поддерживает блокировки уровня строки, транзакции и мультиуправление версиями, поэтому даже в большой степени смешанные операции чтения-записи не замедлят его почти так же как MyISAM.
Также удостоверьтесь, что независимо от того, что механизм устройства хранения данных используется, он правильно настраивается. Поскольку MyISAM key_buffer_size и table_cache являются самыми важными значениями для настройки, для InnoDB первой вещью корректироваться является innodb_buffer_pool_size.
Но оба из механизмов устройства хранения данных имеют свои собственные глюки: например, только MyISAM поддерживает полнотекстовое индексирование, и табличное пространство InnoDB не уменьшается, таким образом, в активно обновленной таблице, где существует много из, удаляет/обновляет/вставляет продолжение, необходимо вывести, чтобы представить содержание в виде таблицы и высосать их, въезжают задним ходом время от времени.
http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html
После сжатия таблицы с myisampack необходимо использовать myisamchk - запрос для восстановления его индексов.
Но я не знаю, необходимо ли когда-нибудь делать это. Индексы должны быть обновлены автоматически.
Тайм-аут блокировок? MySQL вполне прилично разработан в этом отношении, особенно при использовании механизма InnoDB.
Индексы не должны быть повторно индексированы..., но они должны быть правильно индексированы во-первых.
Если мы говорим о фактических блокировках, как в мертвой блокировке / тайм-аут, необходимо проверить на любого подозрительного LOCK TABLES
команда.
Похоже на проблемы со статистикой индекса.
Если вы используете MyISAM, внезапные всплески INSERT могут отбросить статистику в глазах оптимизатора запросов MySQL. Это приведет к тому, что оптимизатор запросов MySQL будет делать очень неверные предположения в планах EXPLAIN запросов SELECT.
Если вы используете InnoDB, ANALYZE TABLE становится совершенно бесполезным.
Пока таблица достаточно мала, ANALYZE TABLE остается все, что вы действительно можете сделать для MyISAM. Перестройка индексов может периодически помогать в таблицах InnoDB.
Пока таблицы не сильно написаны, статистика индекса будет оставаться стабильной, а планы запросов EXPLAIN останутся более согласованными.
Просто помните: как только у вас будет множество INSERT, UPDATE и DELETEs, все ставки отключены для достоверной статистики индекса до следующего перестроения или ANALYZE TABLE.
Что касается периодических тайм-аутов блокировки, вот что следует учитывать: для таблиц InnoDB возможно тайм-аут при тупиках.
SELECT-запросы могут выполнять блокировки для gen_clust_index , также известного как Clustered Индекс.
Вот три вопроса DBA Stack Exchange, которые я внимательно рассмотрел с @RedBlueThing , человеком, который задавал эти вопросы. @RedBlueThing нашел способ ответить на свои вопросы.
Внимательно прочтите эти ссылки. Надеюсь, это поможет.
У меня были похожие проблемы, и в «старые времена» Sql Server я бы изменил запросы на Select with NOLOCK ().
Я решил эту проблему в хранимых процедурах MySQL, используя:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
-- execute select command here such as (this works in stored procs as well):
SELECT LAST_NAME FROM TEMP WHERE NAME LIKE 'SMITH%' ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
-Clark Vera