Блог bitmanager

Индексы в базе - краеугольный камень производительности

Для людей, которые хоть раз писали и оптимизировали базу данных, не секрет, что индексы - первое, на что стоит взглянуть, если у тебя проблемы с производительностью. И все равно, даже сейчас есть проекты, у которых на базу в 40 Гб приходится небольшая горсточка индексов.

И вот fullscan насилует серверный диск, сервер скрипит и трещит и никакие припарки ему не помогают. А ведь проект уже зрелый, работает давно, и, видать, всех все устраивало. Кроме сервера. Встал вопрос: какие индексы добавлять?

Чтоб вы представляли, бэкенд состоял более чем из 10000 файлов, которые читали и писали в 8 баз разной степени наполненности. Ну еще технический долг, неработающие базы, и все это крутится на продакшене. То есть сломать ну никак нельзя, не простят. В итоге, после пары экспериментов разной степени упоротости я решил делать так:
  • располагаем базы по размеру в порядке убывания;
  • располагаем таблицы в базах по количеству строк в них в порядке убывания;
  • grep-аем все файлы бэкенда в поисках строк с названием таблиц и считываем пять строк до и после искомой:
  • отсеиваем мусор;
  • по запросам к искомой таблице понимаем, какие нужны индексы;
  • добавляем их.

Работенка та еще была. Особенно, когда пошли таблицы без префиксов и со стандартными именами, дававшими сотни ложных срабатываний. Но базе это помогло, нагрузка на нее упала раз в 6.
Записки сисадмина