Оптимизация базы данных обычно представляет собой сочетание двух вещей
- Уменьшить количество запросов к базе данных
- Сокращение количества данных, которые необходимо просмотреть, чтобы ответить на запросы
Сокращение количества запросов обычно выполняется путем кэширования энергонезависимых / менее важных данных (например, «Какие пользователи в сети» или «Какие последние сообщения этого пользователя?») Внутри приложения (если возможно) или в внешнее - более эффективное - хранилище данных (memcached, redis и т. д.). Если у вас есть информация, которая требует большого объема записи (например, счетчики посещений) и не нуждается в семантике ACID , вы также можете подумать о переносе ее из базы данных Postgres в более эффективные хранилища данных.
Оптимизация времени выполнения запроса более сложна - это может составить создание специальных индексов (или индексов в первую очередь ), изменение (возможно, денормализация) модели данных или изменение фундаментальный подход к работе с базой данных. См., Например, разбиение на страницы, выполненное в Postgres доклад Маркуса Винанда о том, как переосмыслить концепцию нумерации страниц, чтобы сделать ее более эффективной для базы данных
Медленное измерение запросов
Но чтобы понять, какие запросы следует сначала просмотреть, нужно знать, как часто они выполняются и как долго они выполняются в среднем.
Одним из подходов к этому является регистрация всех (или «медленных») запросов, включая время их выполнения, и последующий анализ журнала запросов. Хорошим инструментом для этого является pgfouine
, который уже упоминался ранее в этом обсуждении, с тех пор его заменили на pgbadger
, который написан на более дружественном языке, гораздо быстрее и активнее поддерживается.
И pgfouine
, и pgbadger
страдают от того, что им нужно включить ведение журнала запросов, что может привести к заметному снижению производительности базы данных или вызвать проблемы с дисковым пространством, а также из-за того, что при анализе журнала инструмент может занять довольно много времени и не даст вам актуальных сведений о том, что происходит в базе данных.
Ускорение с расширениями
Для устранения этих недостатков теперь есть два расширения, которые отслеживают производительность запросов непосредственно в базе данных - pg_stat_statements
(что полезно только в версии 9.2 или новее) и pg_stat_plans
. Оба расширения предлагают одинаковую базовую функциональность - отслеживание того, как часто выполнялся заданный «нормализованный запрос» (строка запроса за вычетом всех литералов выражения) и сколько времени он занимал в целом. В связи с тем, что это делается в то время, когда запрос фактически выполняется, это делается очень эффективным образом, в синтетических тестах измеримые накладные расходы составили менее 5%.
Смысл данных
Сам список запросов очень «сухой» с информационной точки зрения. Мы работали над третьим расширением, пытаясь учесть этот факт и предложить более качественное представление данных под названием pg_statsinfo
(вместе с pg_stats_reporter
), но это немного сложное дело, чтобы запустить его и запустить .
Чтобы предложить более удобное решение этой проблемы, я начал работать над коммерческим проектом, который сфокусирован на pg_stat_statements
и pg_stat_plans
и дополняет информацию, собранную множеством других данных, извлеченных из базы данных. Он называется pganalyze
, и вы можете найти его в https://pganalyze.com/.
Чтобы предложить краткий обзор интересных инструментов и проектов в области мониторинга Postgres, я также начал составлять список на Postgres Wiki , который регулярно обновляется.