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) |