Когда следует перестраивать индексы базы данных? - PullRequest
26 голосов
/ 26 ноября 2008

Я читал о рефакторинге большого медленного SQL-запроса вместо здесь , и текущий максимальный ответ от Митча Уитта, который хочет убедиться, что запрос использует индексы для основных выборок, и упоминает:

Первое, что я хотел бы сделать, это убедиться, что периодически выполняется задание обслуживания активного индекса. Если нет, восстановите все существующие индексы или, если это невозможно, хотя бы обновите статистику.

Я всего лишь любитель DBA, и я сделал несколько внештатных программ, которые в основном являются клиентскими приложениями Java для настольных компьютеров, а иногда и бэкэндом MySQL. Когда я настраиваю систему, я знаю, что нужно создать индекс по столбцам, к которым будет выполняться запрос, есть varchar CaseID и varchar CustName.

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

Я хотел спросить сообщество о регулярном обслуживании базы данных. Нужно ли перестраивать индексы? Могу ли я доверять, чтобы серверная часть MySQL продолжала работать до тех пор, пока с ней никто не связывался, а объем данных не превышал нескольких гигабайт?

Ответы [ 3 ]

24 голосов
/ 26 ноября 2008

Нет необходимости «перестраивать» индекс. Они всегда в курсе. Может быть, он имел в виду восстановление таблицы. В зависимости от ваших шаблонов использования и схемы, вы можете получить фрагментированные страницы в InnoDB, и я думаю, в MyISAM. Восстановление таблицы может повысить производительность, избавившись от фрагментации ваших данных на диске. Я не использую таблицы MyISAM регулярно, но считаю, что рекомендуется запускать OPTIMIZE TABLE с определенными шаблонами использования. См. Документацию MySQL по OPTIMIZE TABLE для получения полезной информации о MyISAM и InnoDB.

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

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

11 голосов
/ 26 ноября 2008

Обычно рекомендуется настроить cronjob для оптимизации индексов и проверки на наличие ошибок.

См. mysqlcheck . Типичное задание cron выглядит примерно так: mysqlcheck -Aaos, который проверяет все таблицы во всех базах данных на наличие ошибок, оптимизирует индексы и выводит только ошибки.

2 голосов
/ 10 декабря 2008

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

...