Как ускорить зависающий SQL-запрос
Python
Middle
Без компании
Как ускорить зависающий SQL-запрос
Ответы
Оптимизация SQL-запросов в Python требует анализа и доработки на нескольких уровнях:
- **Индексы** - убедитесь, что запрос использует индексы для JOIN, WHERE и ORDER BY:
```
# Для Django ORM
Model.objects.filter(some_field=value).explain() # проверить использование индексов
```
- **Оптимизация запроса**:
- Избегайте SELECT * - выбирайте только нужные поля
- Используйте LIMIT для тестирования
- Замените подзапросы на JOIN
- **Кэширование**:
```
from django.core.cache import cache
def get_data():
key = 'expensive_query'
result = cache.get(key)
if not result:
result = list(MyModel.objects.filter(...)) # тяжелый запрос
cache.set(key, result, timeout=3600)
return result
```
- **Денормализация** - иногда стоит добавить избыточные данные для ускорения выборок
- **Профилирование**:
```
# Для PostgreSQL
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("EXPLAIN ANALYZE SELECT * FROM my_table")
print(cursor.fetchall())
```
Для сложных случаев рассмотрите использование материализованных представлений или выделенных сервисов обработки данных.