--- aliases: tags: - зрелость/🌱 date: - - 2024-06-17 zero-link: - "[[00 Базы Данных]]" parents: - "[[00 SQL]]" linked: --- Что такое плохой или медленный запрос - Запрос по времени работает дольше остальных - Запрос, который потребляет больше ресурсов, чем остальные запросы - Быстро выполняемый запрос может быть также плохим, если выполняется часто и в сумме за N времени потребляет много ресурсов. **Алгоритм оптимизации запросов:** - Проверить настройки. Возможно проблемы не связаны с запросами? - Слабое железо у сервера БД - Проблемы сети - Неправильные настройки БД - [PostgreSQL](00%20PostgreSQL.md) - Много конекшенов, но ее используется [PgBouncer](PgBouncer.md). - Выключен или не настроен autovacuum - Отобрать запросы для оптимизации - ==Анализом необходимо заниматься только на продуктовой БД.== - Все подряд оптимизировать бесполезно. Нужно отобрать самые проблемные и начать с них. - [PostgreSQL](00%20PostgreSQL.md) - Использовать [GitHub - Полезные утилиты для тюнинга PostgreSQL](https://github.com/dataegret/pg-utils) - global_reports - Использовать [[pg_stat_statements]] - Оптимизировать запросы - Использовать [Explain в PostgreSQL](Explain%20в%20PostgreSQL.md) и [Explain в MySQL](Explain%20в%20MySQL.md) для анализа запросов - Повторить с новыми запросами из топа. **Где могут быть проблемы?** - Передача запроса от клиента (сервиса). [Пример при использовании IN](IN%20SQL.md#Проблемы%20производительности%20IN) - Сложный запрос, который долго парсится. Можно посмотреть в explain. - БД долго вычисляет план запроса и проводит оптимизации. Например, при использовании join. - Исполнение и возврат результатов. Если вы возвращаете несколько гигабайт, это не будет быстро. **Как улучшить?** - Переписать запрос - Использовать [Индексы в MySQL](Индексы%20в%20MySQL.md) / [Индекс в PostgreSQL](Индекс%20в%20PostgreSQL.md) **Невозможно улучшить** - count(\*). Можно использовать приближенное значение из таблицы статистики. - join на 300 таблиц - Запрос возвращает клиенту 1 000 000 000 строк ![Почему JOIN работает медленно?](JOIN%20SQL.md#Почему%20JOIN%20работает%20медленно?) ![Проблемы производительности IN](IN%20SQL.md#Проблемы%20производительности%20IN)