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

53 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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