Назад | Перейти на главную страницу

когда мне переиндексировать мою базу данных MySQL?

В моей базе данных (MySQL) периодически возникают таймауты блокировки. У меня пока нет основной причины, и у нас пока нет рекомендаций. Раньше мне пришлось бы переиндексировать свои индексы SQL Server и Oracle, потому что они в этом нуждались. Никто и никогда не говорит об этом и MySQL.

Есть рекомендации?

Как уже отмечалось, выбранный механизм хранения является основным фактором, влияющим на производительность MySQL. Если вы используете MyISAM или InnoDB, это зависит от вашей рабочей нагрузки.

Если в вашем случае операции SELECT выполняются быстро и не так много операций записи в БД, MyISAM совсем не плох. Но если у вас есть даже умеренная активность записи и некоторые длительные операции SELECT, имейте в виду, что MyISAM поддерживает только блокировки на уровне таблицы. Во время медленного SELECT все операции записи будут помещены в очередь, что довольно скоро может привести ко всем видам неприятных проблем.

InnoDB поддерживает блокировки на уровне строк, транзакции и многоверсионность, поэтому даже сильно смешанные операции чтения / записи не замедлят его почти так же, как MyISAM.

Также убедитесь, что какой бы механизм хранения ни использовался, он правильно настроен. Для MyISAM key_buffer_size и table_cache являются наиболее важными значениями для настройки, для InnoDB первое, что нужно настроить, это innodb_buffer_pool_size.

Но у обоих механизмов хранения есть свои недостатки: например, только MyISAM поддерживает полнотекстовую индексацию, а табличное пространство InnoDB не сжимается, поэтому в активно обновляемой таблице, где происходит много удалений / обновлений / вставок, вам необходимо выгружать содержимое таблицы и время от времени всасывать их обратно.

Вам не нужно повторно индексировать MySQL, за исключением случаев повреждения в результате сбоя или внезапного отключения питания. Если у вас возникли проблемы с блокировкой, вы можете захотеть преобразовать свои таблицы MyISAM (или, по крайней мере, таблицы с наибольшими проблемами конфликтов блокировки) в InnoDB. Для этого требуется немного больше ОЗУ, но он поддерживает блокировку на уровне строк, а не только на уровне таблицы (среди многих других улучшений).

Вам также может потребоваться запустить команду «показать полный список процессов»; чтобы убедиться, что это не что-то явно явно блокирующее таблицу, например, какое-то резервное копирование.

Таймаут блокировки? MySQL очень хорошо разработан в этом отношении, особенно если вы используете движок InnoDB.
Индексы не нужно повторно индексировать ... но они должны быть правильно индексированный в первую очередь.

Если мы говорим о фактических блокировках, таких как тупик / тайм-аут, вы должны проверить наличие подозрительных LOCK TABLES команда.

Похоже на проблемы со статистикой индекса.

Если вы используете MyISAM, внезапные всплески INSERT могут отбросить статистику в глазах оптимизатора запросов MySQL. Это приведет к тому, что оптимизатор запросов MySQL будет делать очень неверные предположения в планах EXPLAIN запросов SELECT.

Если вы используете InnoDB, ANALYZE TABLE становится совершенно бесполезным.

Пока таблица достаточно мала, ANALYZE TABLE - это все, что вы действительно можете сделать для MyISAM. Восстановление индексов может периодически помогать таблицам InnoDB.

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

Просто помните: как только у вас будет множество INSERT, UPDATE и DELETE, все ставки на достоверную статистику индексов будут отключены до следующего перестроения или ANALYZE TABLE.

Что касается тайм-аутов прерывистой блокировки, вот что нужно учитывать: для SELECT в таблицах InnoDB возможно тайм-аут при тупиках.

Запросы SELECT могут выполнять блокировку gen_clust_index, также известный как кластерный индекс.

Вот три вопроса об обмене стеком для администраторов баз данных, на которые я настойчиво просматривал @RedBlueThing, человек, задавший эти вопросы. @RedBlueThing нашел способ ответить на свои вопросы.

Пожалуйста, прочтите внимательно эти ссылки. Надеюсь, это поможет.

http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html

После сжатия таблицы с помощью myisampack следует использовать myisamchk -rq для восстановления ее индексов.

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

У меня были подобные проблемы, и в «старые времена» 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 ;

-Кларк Вера