digital-garden/_inbox/Оптимизация SQL запросов.md

53 lines
3.3 KiB
Markdown
Raw Normal View History

2024-06-17 18:42:04 +03:00
---
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)
2024-07-24 11:14:01 +03:00
- Использовать [pg_utils](pg_utils.md)
2024-06-17 18:42:04 +03:00
- Использовать [[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)