Подтвердить что ты не робот

Оптимизировать и проверить таблицу mysql

У меня есть база данных, используемая для статистики, с более чем 2000 таблицами, каждая с ~ 100 миллионами строк.

Я думаю, что несколько раз в неделю было бы неплохо проверить таблицы, чтобы убедиться, что они здоровы, а если нет, отремонтировать и оптимизировать их.

Ежедневно обновляются 60% таблиц, а остальные - архивы.

Мой вопрос о check(repair)/optimize: Хорошо ли проверять работоспособность стола и оптимизировать их несколько раз в неделю, чтобы обеспечить бесперебойную работу системы?

4b9b3361

Ответ 1

Как правило, вам нужно OPTIMIZE-таблицу, когда ее файл данных слишком фрагментирован на диске (используйте инструменты для вашей файловой системы, чтобы проверить - script, связанный с GiantRobot, не вычисляет фрагментацию), когда было много обновленных строк и их размер (что создаст фрагментацию строки) или после удаления многих записей, когда вы не будете добавлять их снова в ближайшее время. Поскольку свободное пространство используется MySQL для новых строк, когда удаленные и новые записи имеют одинаковый размер строки, OPTIMIZE не требуется.

CHECK TABLE используется только тогда, когда вы подозреваете повреждение данных (что не должно происходить при обычном прогоне). В некоторых дистрибутивах Linux (например, Debian) есть сценарии запуска, которые запускают CHECK TABLE для всех таблиц при запуске сервера MySQL. REPAIR TABLE затем используется для восстановления поврежденных таблиц.

ANALYZE TABLE может использоваться для обновления мощности индекса, которая используется при определении плана выполнения запроса. Обычно это необходимо только в особых случаях.

Из вашего вопроса неясно, как используются ваши таблицы статистики... сколько записей, удалений и чтений? Мои таблицы статистики записываются все время, и один раз в день они считываются, данные консолидируются и записываются в другую таблицу, а затем удаляются. В этом случае нет необходимости запускать OPTIMIZE, поскольку данные не часто читаются, а свободное пространство используется для новых данных. Я использую разделение по дням, поэтому вместо удаления записей (что довольно медленно) я просто DROP PARTITION (что занимает 1 сек.)

Ответ 2

2000 таблиц и 100 миллионов строк кажутся огромными! если вы попытаетесь оптимизировать каждую таблицу несколько раз в неделю, во время оптимизации, таблицы будут заблокированы, поэтому вы не сможете писать эти таблицы, пока не закончите работу вот script, который проверяет только фрагментированные таблицы (вероятно,% 60 ваших таблиц) и оптимизирует только фрагментированные, сообщите нам, если он работает.

Примечание. Я не смог протестировать script, так как я использую Windows-машину для моего текущего проекта. Прочитайте комментарии и примечания ниже script для ссылки i, предоставленной

Оптимизировать только фрагментированные таблицы в MySQL

Ответ 3

Ремонт очень медленный с большими таблицами; вам, вероятно, следует избегать очень больших таблиц, особенно с большим количеством индексов, с MyISAM. Вместо этого рекомендуется их разбить, чтобы сократить время ремонта. Это может потребовать существенного изменения кода приложения.

Вы также можете увидеть проблемы с ремонтом здесь