Индексирование внешнего ключа в Django Models

Я хочу проиндексировать очень распространенный запрос в проекте, который включает в себя CharField и ForeignKey. У меня есть узкое место в этом запросе, и я пытаюсь его оптимизировать. У меня есть следующее:

class Bill(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    category = models.CharField(max_length=200, null=True, blank=True)
    ...

Я добавил это, чтобы попытаться улучшить производительность:

class Meta:
    indexes = [
        models.Index(fields=['category', 'company']),
    ]

Но результат тот же, запрос такой:

models.Bill.objects.filter(company=company, category='recibida')

Есть ли что-то еще, что я мог бы улучшить? Хорошо ли выполнена эта индексация?

Созданный вами индекс действителен, но, возможно, он вам не нужен. Он создает комбинированный индекс обоих полей и будет использоваться только в том случае, если у вас есть запрос, в котором также используются оба поля.

Если ваш запрос обращается только к одному из полей за раз, лучше добавить db_index=True после каждого поля.

Однако помните, что поиск лучшего индекса для запроса во многом зависит от контекста, и лучший подход - использовать SQL EXPLAIN, например, с помощью django-debug-toolbar, чтобы найти его.

Вернуться на верх