Django фильтрует по полю DateTimeField очень медленно

Environment

  • AWS RDS t3.micro (2 vCPU, 1GiB RAM)
  • PostgreSQL 11.10

У меня есть более 15 миллионов записей Note, модель которых выглядит следующим образом:

class Note(models.Model):
    ...
    post_date = models.DateTimeField()
    ...

К вашему сведению, Note имеет 35+ полей, некоторые из которых являются полями ManyToManyField и ForeignKey.

Проблема

start_time = time.time()                         
queryset = Note.objects.filter(       
    # post_date=datetime.now() - timedelta(days=6),           
    post_date__year=2021,                           
    post_date__month__gt=7,                         
)[:100]                                          
tmp = list(queryset)                             
print("Time elapsed: ", time.time() - start_time)

Приведенный выше код занимает всего 0,68 секунды, но если я откомментирую # postTs=datetime.now() - timedelta(days=6),, то время увеличится до 55,53 секунды.

Для смягчения этой проблемы я рассматриваю возможность преобразования DateTimeField в PositiveIntegerField для хранения значений временных меток. Прежде чем сделать этот шаг, есть ли что-нибудь еще, что я могу попробовать? Почему это происходит?

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