Какие простые шаги улучшения производительности базы данных существуют
Что проверяют
Умеете ли вы искать причину медленного запроса, а не перечислять всё подряд из учебника. Аналитику важно показать, что он начинает с плана выполнения и своих запросов, а не с «докупить серверу памяти». Следом обычно просят разобрать конкретный медленный запрос или объяснить, чем в нём помог бы индекс.
Как отвечать
Стройте ответ от дешёвого к дорогому:
- посмотреть план:
EXPLAIN ANALYZEв PostgreSQL показывает, где время уходит наSeq Scan, сортировку на диске или вложенный цикл по миллиону строк. Без плана любая оптимизация превращается в угадывание; - переписать запрос: выбирать только нужные колонки вместо
SELECT *, фильтровать доJOINи агрегации, заменять коррелированные подзапросы наJOINилиEXISTS, не оборачивать колонку в функцию внутриWHERE; - добавить индекс: на колонки из частых фильтров и соединений, составной с правильным порядком колонок, частичный под типовое условие;
- обновить статистику:
ANALYZEпосле массовой загрузки, иначе планировщик ошибается в оценке числа строк и выбирает плохой план; - ограничить объём: партиционирование больших таблиц по дате, архив старых данных, материализованные представления или витрины для тяжёлых отчётов с пересчётом по расписанию;
- найти самые дорогие запросы:
pg_stat_statementsили журнал медленных запросов, чтобы чинить то, что реально нагружает базу.
Настройку памяти и параметров сервера упомяните последней и как зону администратора: аналитик приносит ему план и цифры, а не меняет work_mem на проде сам.
Где спотыкаются
Называют нормализацию способом ускорения. Она убирает дубли и аномалии обновления, но добавляет соединения, а для аналитических запросов часто быстрее денормализованная витрина.
Советуют индекс на каждую колонку. Каждый индекс замедляет вставку и обновление, а на колонке с двумя-тремя значениями планировщик его всё равно проигнорирует и прочитает таблицу целиком.
Выдают «регулярно перестраивать индексы» за универсальное правило. В PostgreSQL мёртвые строки убирает autovacuum, а REINDEX нужен при реальном раздувании индекса, которое сначала надо измерить.