53 lines
3.4 KiB
Markdown
53 lines
3.4 KiB
Markdown
|
---
|
|||
|
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)
|